aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-11-09 00:47:08 -0500
committerJeff Garzik <jgarzik@pobox.com>2005-11-09 00:47:08 -0500
commiteedb9f09e92598c165de37a8c210434d270ca3a6 (patch)
tree11f4ab9bcc75210c2b4a15dc33c3f4d6a612deec
parentf24e09754bcb4d367664ea635c0c4ccde6ec4df5 (diff)
parent826d2abe9945372c8838398bfd88a1caa5844d41 (diff)
Merge rsync://bughost.org/repos/ipw-delta/
-rw-r--r--Documentation/networking/README.ipw2100132
-rw-r--r--Documentation/networking/README.ipw2200196
-rw-r--r--MAINTAINERS18
-rw-r--r--drivers/net/wireless/ipw2100.c2850
-rw-r--r--drivers/net/wireless/ipw2100.h169
-rw-r--r--drivers/net/wireless/ipw2200.c6609
-rw-r--r--drivers/net/wireless/ipw2200.h574
7 files changed, 7579 insertions, 2969 deletions
diff --git a/Documentation/networking/README.ipw2100 b/Documentation/networking/README.ipw2100
index 2046948b020d..3ab40379d1cf 100644
--- a/Documentation/networking/README.ipw2100
+++ b/Documentation/networking/README.ipw2100
@@ -1,27 +1,82 @@
1 1
2=========================== 2Intel(R) PRO/Wireless 2100 Driver for Linux in support of:
3Intel(R) PRO/Wireless 2100 Network Connection Driver for Linux 3
4Intel(R) PRO/Wireless 2100 Network Connection
5
6Copyright (C) 2003-2005, Intel Corporation
7
4README.ipw2100 8README.ipw2100
5 9
6March 14, 2005 10Version: 1.1.3
11Date : October 17, 2005
7 12
8===========================
9Index 13Index
10--------------------------- 14-----------------------------------------------
110. Introduction 150. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
121. Release 1.1.0 Current Features 161. Introduction
132. Command Line Parameters 172. Release 1.1.3 Current Features
143. Sysfs Helper Files 183. Command Line Parameters
154. Radio Kill Switch 194. Sysfs Helper Files
165. Dynamic Firmware 205. Radio Kill Switch
176. Power Management 216. Dynamic Firmware
187. Support 227. Power Management
198. License 238. Support
20 249. License
21 25
22=========================== 26
230. Introduction 270. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
24------------ ----- ----- ---- --- -- - 28-----------------------------------------------
29
30Important Notice FOR ALL USERS OR DISTRIBUTORS!!!!
31
32Intel wireless LAN adapters are engineered, manufactured, tested, and
33quality checked to ensure that they meet all necessary local and
34governmental regulatory agency requirements for the regions that they
35are designated and/or marked to ship into. Since wireless LANs are
36generally unlicensed devices that share spectrum with radars,
37satellites, and other licensed and unlicensed devices, it is sometimes
38necessary to dynamically detect, avoid, and limit usage to avoid
39interference with these devices. In many instances Intel is required to
40provide test data to prove regional and local compliance to regional and
41governmental regulations before certification or approval to use the
42product is granted. Intel's wireless LAN's EEPROM, firmware, and
43software driver are designed to carefully control parameters that affect
44radio operation and to ensure electromagnetic compliance (EMC). These
45parameters include, without limitation, RF power, spectrum usage,
46channel scanning, and human exposure.
47
48For these reasons Intel cannot permit any manipulation by third parties
49of the software provided in binary format with the wireless WLAN
50adapters (e.g., the EEPROM and firmware). Furthermore, if you use any
51patches, utilities, or code with the Intel wireless LAN adapters that
52have been manipulated by an unauthorized party (i.e., patches,
53utilities, or code (including open source code modifications) which have
54not been validated by Intel), (i) you will be solely responsible for
55ensuring the regulatory compliance of the products, (ii) Intel will bear
56no liability, under any theory of liability for any issues associated
57with the modified products, including without limitation, claims under
58the warranty and/or issues arising from regulatory non-compliance, and
59(iii) Intel will not provide or be required to assist in providing
60support to any third parties for such modified products.
61
62Note: Many regulatory agencies consider Wireless LAN adapters to be
63modules, and accordingly, condition system-level regulatory approval
64upon receipt and review of test data documenting that the antennas and
65system configuration do not cause the EMC and radio operation to be
66non-compliant.
67
68The drivers available for download from SourceForge are provided as a
69part of a development project. Conformance to local regulatory
70requirements is the responsibility of the individual developer. As
71such, if you are interested in deploying or shipping a driver as part of
72solution intended to be used for purposes other than development, please
73obtain a tested driver from Intel Customer Support at:
74
75http://support.intel.com/support/notebook/sb/CS-006408.htm
76
77
781. Introduction
79-----------------------------------------------
25 80
26This document provides a brief overview of the features supported by the 81This document provides a brief overview of the features supported by the
27IPW2100 driver project. The main project website, where the latest 82IPW2100 driver project. The main project website, where the latest
@@ -34,9 +89,8 @@ potential fixes and patches, as well as links to the development mailing list
34for the driver project. 89for the driver project.
35 90
36 91
37=========================== 922. Release 1.1.3 Current Supported Features
381. Release 1.1.0 Current Supported Features 93-----------------------------------------------
39---------------------------
40- Managed (BSS) and Ad-Hoc (IBSS) 94- Managed (BSS) and Ad-Hoc (IBSS)
41- WEP (shared key and open) 95- WEP (shared key and open)
42- Wireless Tools support 96- Wireless Tools support
@@ -51,9 +105,8 @@ on the amount of validation and interoperability testing that has been
51performed on a given feature. 105performed on a given feature.
52 106
53 107
54=========================== 1083. Command Line Parameters
552. Command Line Parameters 109-----------------------------------------------
56---------------------------
57 110
58If the driver is built as a module, the following optional parameters are used 111If the driver is built as a module, the following optional parameters are used
59by entering them on the command line with the modprobe command using this 112by entering them on the command line with the modprobe command using this
@@ -75,9 +128,9 @@ associate boolean associate=0 /* Do NOT auto associate */
75disable boolean disable=1 /* Do not power the HW */ 128disable boolean disable=1 /* Do not power the HW */
76 129
77 130
78=========================== 1314. Sysfs Helper Files
793. Sysfs Helper Files
80--------------------------- 132---------------------------
133-----------------------------------------------
81 134
82There are several ways to control the behavior of the driver. Many of the 135There are several ways to control the behavior of the driver. Many of the
83general capabilities are exposed through the Wireless Tools (iwconfig). There 136general capabilities are exposed through the Wireless Tools (iwconfig). There
@@ -120,9 +173,8 @@ For the device level files, see /sys/bus/pci/drivers/ipw2100:
120 based RF kill from ON -> OFF -> ON, the radio will NOT come back on 173 based RF kill from ON -> OFF -> ON, the radio will NOT come back on
121 174
122 175
123=========================== 1765. Radio Kill Switch
1244. Radio Kill Switch 177-----------------------------------------------
125---------------------------
126Most laptops provide the ability for the user to physically disable the radio. 178Most laptops provide the ability for the user to physically disable the radio.
127Some vendors have implemented this as a physical switch that requires no 179Some vendors have implemented this as a physical switch that requires no
128software to turn the radio off and on. On other laptops, however, the switch 180software to turn the radio off and on. On other laptops, however, the switch
@@ -134,9 +186,8 @@ See the Sysfs helper file 'rf_kill' for determining the state of the RF switch
134on your system. 186on your system.
135 187
136 188
137=========================== 1896. Dynamic Firmware
1385. Dynamic Firmware 190-----------------------------------------------
139---------------------------
140As the firmware is licensed under a restricted use license, it can not be 191As the firmware is licensed under a restricted use license, it can not be
141included within the kernel sources. To enable the IPW2100 you will need a 192included within the kernel sources. To enable the IPW2100 you will need a
142firmware image to load into the wireless NIC's processors. 193firmware image to load into the wireless NIC's processors.
@@ -146,9 +197,8 @@ You can obtain these images from <http://ipw2100.sf.net/firmware.php>.
146See INSTALL for instructions on installing the firmware. 197See INSTALL for instructions on installing the firmware.
147 198
148 199
149=========================== 2007. Power Management
1506. Power Management 201-----------------------------------------------
151---------------------------
152The IPW2100 supports the configuration of the Power Save Protocol 202The IPW2100 supports the configuration of the Power Save Protocol
153through a private wireless extension interface. The IPW2100 supports 203through a private wireless extension interface. The IPW2100 supports
154the following different modes: 204the following different modes:
@@ -200,9 +250,8 @@ xxxx/yyyy will be replaced with 'off' -- the level reported will be the active
200level if `iwconfig eth1 power on` is invoked. 250level if `iwconfig eth1 power on` is invoked.
201 251
202 252
203=========================== 2538. Support
2047. Support 254-----------------------------------------------
205---------------------------
206 255
207For general development information and support, 256For general development information and support,
208go to: 257go to:
@@ -218,9 +267,8 @@ For installation support on the ipw2100 1.1.0 driver on Linux kernels
218 267
219 http://supportmail.intel.com 268 http://supportmail.intel.com
220 269
221=========================== 2709. License
2228. License 271-----------------------------------------------
223---------------------------
224 272
225 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. 273 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
226 274
diff --git a/Documentation/networking/README.ipw2200 b/Documentation/networking/README.ipw2200
index 6916080c5f03..c6492d3839fa 100644
--- a/Documentation/networking/README.ipw2200
+++ b/Documentation/networking/README.ipw2200
@@ -1,33 +1,89 @@
1 1
2Intel(R) PRO/Wireless 2915ABG Driver for Linux in support of: 2Intel(R) PRO/Wireless 2915ABG Driver for Linux in support of:
3 3
4Intel(R) PRO/Wireless 2200BG Network Connection 4Intel(R) PRO/Wireless 2200BG Network Connection
5Intel(R) PRO/Wireless 2915ABG Network Connection 5Intel(R) PRO/Wireless 2915ABG Network Connection
6 6
7Note: The Intel(R) PRO/Wireless 2915ABG Driver for Linux and Intel(R) 7Note: The Intel(R) PRO/Wireless 2915ABG Driver for Linux and Intel(R)
8PRO/Wireless 2200BG Driver for Linux is a unified driver that works on 8PRO/Wireless 2200BG Driver for Linux is a unified driver that works on
9both hardware adapters listed above. In this document the Intel(R) 9both hardware adapters listed above. In this document the Intel(R)
10PRO/Wireless 2915ABG Driver for Linux will be used to reference the 10PRO/Wireless 2915ABG Driver for Linux will be used to reference the
11unified driver. 11unified driver.
12 12
13Copyright (C) 2004-2005, Intel Corporation 13Copyright (C) 2004-2005, Intel Corporation
14 14
15README.ipw2200 15README.ipw2200
16 16
17Version: 1.0.0 17Version: 1.0.8
18Date : January 31, 2005 18Date : October 20, 2005
19 19
20 20
21Index 21Index
22----------------------------------------------- 22-----------------------------------------------
230. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
231. Introduction 241. Introduction
241.1. Overview of features 251.1. Overview of features
251.2. Module parameters 261.2. Module parameters
261.3. Wireless Extension Private Methods 271.3. Wireless Extension Private Methods
271.4. Sysfs Helper Files 281.4. Sysfs Helper Files
282. About the Version Numbers 292. Ad-Hoc Networking
293. Support 303. Interacting with Wireless Tools
304. License 313.1. iwconfig mode
324. About the Version Numbers
335. Firmware installation
346. Support
357. License
36
37
380. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
39-----------------------------------------------
40
41Important Notice FOR ALL USERS OR DISTRIBUTORS!!!!
42
43Intel wireless LAN adapters are engineered, manufactured, tested, and
44quality checked to ensure that they meet all necessary local and
45governmental regulatory agency requirements for the regions that they
46are designated and/or marked to ship into. Since wireless LANs are
47generally unlicensed devices that share spectrum with radars,
48satellites, and other licensed and unlicensed devices, it is sometimes
49necessary to dynamically detect, avoid, and limit usage to avoid
50interference with these devices. In many instances Intel is required to
51provide test data to prove regional and local compliance to regional and
52governmental regulations before certification or approval to use the
53product is granted. Intel's wireless LAN's EEPROM, firmware, and
54software driver are designed to carefully control parameters that affect
55radio operation and to ensure electromagnetic compliance (EMC). These
56parameters include, without limitation, RF power, spectrum usage,
57channel scanning, and human exposure.
58
59For these reasons Intel cannot permit any manipulation by third parties
60of the software provided in binary format with the wireless WLAN
61adapters (e.g., the EEPROM and firmware). Furthermore, if you use any
62patches, utilities, or code with the Intel wireless LAN adapters that
63have been manipulated by an unauthorized party (i.e., patches,
64utilities, or code (including open source code modifications) which have
65not been validated by Intel), (i) you will be solely responsible for
66ensuring the regulatory compliance of the products, (ii) Intel will bear
67no liability, under any theory of liability for any issues associated
68with the modified products, including without limitation, claims under
69the warranty and/or issues arising from regulatory non-compliance, and
70(iii) Intel will not provide or be required to assist in providing
71support to any third parties for such modified products.
72
73Note: Many regulatory agencies consider Wireless LAN adapters to be
74modules, and accordingly, condition system-level regulatory approval
75upon receipt and review of test data documenting that the antennas and
76system configuration do not cause the EMC and radio operation to be
77non-compliant.
78
79The drivers available for download from SourceForge are provided as a
80part of a development project. Conformance to local regulatory
81requirements is the responsibility of the individual developer. As
82such, if you are interested in deploying or shipping a driver as part of
83solution intended to be used for purposes other than development, please
84obtain a tested driver from Intel Customer Support at:
85
86http://support.intel.com/support/notebook/sb/CS-006408.htm
31 87
32 88
331. Introduction 891. Introduction
@@ -45,7 +101,7 @@ file.
45 101
461.1. Overview of Features 1021.1. Overview of Features
47----------------------------------------------- 103-----------------------------------------------
48The current release (1.0.0) supports the following features: 104The current release (1.0.8) supports the following features:
49 105
50+ BSS mode (Infrastructure, Managed) 106+ BSS mode (Infrastructure, Managed)
51+ IBSS mode (Ad-Hoc) 107+ IBSS mode (Ad-Hoc)
@@ -56,17 +112,27 @@ The current release (1.0.0) supports the following features:
56+ Full A rate support (2915 only) 112+ Full A rate support (2915 only)
57+ Transmit power control 113+ Transmit power control
58+ S state support (ACPI suspend/resume) 114+ S state support (ACPI suspend/resume)
115
116The following features are currently enabled, but not officially
117supported:
118
119+ WPA
59+ long/short preamble support 120+ long/short preamble support
121+ Monitor mode (aka RFMon)
122
123The distinction between officially supported and enabled is a reflection
124on the amount of validation and interoperability testing that has been
125performed on a given feature.
60 126
61 127
62 128
631.2. Command Line Parameters 1291.2. Command Line Parameters
64----------------------------------------------- 130-----------------------------------------------
65 131
66Like many modules used in the Linux kernel, the Intel(R) PRO/Wireless 132Like many modules used in the Linux kernel, the Intel(R) PRO/Wireless
672915ABG Driver for Linux allows certain configuration options to be 1332915ABG Driver for Linux allows configuration options to be provided
68provided as module parameters. The most common way to specify a module 134as module parameters. The most common way to specify a module parameter
69parameter is via the command line. 135is via the command line.
70 136
71The general form is: 137The general form is:
72 138
@@ -96,14 +162,18 @@ Where the supported parameter are:
96 162
97 debug 163 debug
98 If using a debug build, this is used to control the amount of debug 164 If using a debug build, this is used to control the amount of debug
99 info is logged. See the 'dval' and 'load' script for more info on 165 info is logged. See the 'dvals' and 'load' script for more info on
100 how to use this (the dval and load scripts are provided as part 166 how to use this (the dvals and load scripts are provided as part
101 of the ipw2200 development snapshot releases available from the 167 of the ipw2200 development snapshot releases available from the
102 SourceForge project at http://ipw2200.sf.net) 168 SourceForge project at http://ipw2200.sf.net)
169
170 led
171 Can be used to turn on experimental LED code.
172 0 = Off, 1 = On. Default is 0.
103 173
104 mode 174 mode
105 Can be used to set the default mode of the adapter. 175 Can be used to set the default mode of the adapter.
106 0 = Managed, 1 = Ad-Hoc 176 0 = Managed, 1 = Ad-Hoc, 2 = Monitor
107 177
108 178
1091.3. Wireless Extension Private Methods 1791.3. Wireless Extension Private Methods
@@ -164,8 +234,8 @@ The supported private methods are:
164----------------------------------------------- 234-----------------------------------------------
165 235
166The Linux kernel provides a pseudo file system that can be used to 236The Linux kernel provides a pseudo file system that can be used to
167access various components of the operating system. The Intel(R) 237access various components of the operating system. The Intel(R)
168PRO/Wireless 2915ABG Driver for Linux exposes several configuration 238PRO/Wireless 2915ABG Driver for Linux exposes several configuration
169parameters through this mechanism. 239parameters through this mechanism.
170 240
171An entry in the sysfs can support reading and/or writing. You can 241An entry in the sysfs can support reading and/or writing. You can
@@ -184,13 +254,13 @@ You can set the debug level via:
184 254
185Where $VALUE would be a number in the case of this sysfs entry. The 255Where $VALUE would be a number in the case of this sysfs entry. The
186input to sysfs files does not have to be a number. For example, the 256input to sysfs files does not have to be a number. For example, the
187firmware loader used by hotplug utilizes sysfs entries for transferring 257firmware loader used by hotplug utilizes sysfs entries for transfering
188the firmware image from user space into the driver. 258the firmware image from user space into the driver.
189 259
190The Intel(R) PRO/Wireless 2915ABG Driver for Linux exposes sysfs entries 260The Intel(R) PRO/Wireless 2915ABG Driver for Linux exposes sysfs entries
191at two levels -- driver level, which apply to all instances of the 261at two levels -- driver level, which apply to all instances of the driver
192driver (in the event that there are more than one device installed) and 262(in the event that there are more than one device installed) and device
193device level, which applies only to the single specific instance. 263level, which applies only to the single specific instance.
194 264
195 265
1961.4.1 Driver Level Sysfs Helper Files 2661.4.1 Driver Level Sysfs Helper Files
@@ -203,6 +273,7 @@ For the driver level files, look in /sys/bus/pci/drivers/ipw2200/
203 This controls the same global as the 'debug' module parameter 273 This controls the same global as the 'debug' module parameter
204 274
205 275
276
2061.4.2 Device Level Sysfs Helper Files 2771.4.2 Device Level Sysfs Helper Files
207----------------------------------------------- 278-----------------------------------------------
208 279
@@ -213,7 +284,7 @@ For the device level files, look in
213For example: 284For example:
214 /sys/bus/pci/drivers/ipw2200/0000:02:01.0 285 /sys/bus/pci/drivers/ipw2200/0000:02:01.0
215 286
216For the device level files, see /sys/bus/pci/[drivers/ipw2200: 287For the device level files, see /sys/bus/pci/drivers/ipw2200:
217 288
218 rf_kill 289 rf_kill
219 read - 290 read -
@@ -231,8 +302,59 @@ For the device level files, see /sys/bus/pci/[drivers/ipw2200:
231 ucode 302 ucode
232 read-only access to the ucode version number 303 read-only access to the ucode version number
233 304
305 led
306 read -
307 0 = LED code disabled
308 1 = LED code enabled
309 write -
310 0 = Disable LED code
311 1 = Enable LED code
312
313 NOTE: The LED code has been reported to hang some systems when
314 running ifconfig and is therefore disabled by default.
315
316
3172. Ad-Hoc Networking
318-----------------------------------------------
319
320When using a device in an Ad-Hoc network, it is useful to understand the
321sequence and requirements for the driver to be able to create, join, or
322merge networks.
323
324The following attempts to provide enough information so that you can
325have a consistent experience while using the driver as a member of an
326Ad-Hoc network.
327
3282.1. Joining an Ad-Hoc Network
329-----------------------------------------------
330
331The easiest way to get onto an Ad-Hoc network is to join one that
332already exists.
234 333
2352. About the Version Numbers 3342.2. Creating an Ad-Hoc Network
335-----------------------------------------------
336
337An Ad-Hoc networks is created using the syntax of the Wireless tool.
338
339For Example:
340iwconfig eth1 mode ad-hoc essid testing channel 2
341
3422.3. Merging Ad-Hoc Networks
343-----------------------------------------------
344
345
3463. Interaction with Wireless Tools
347-----------------------------------------------
348
3493.1 iwconfig mode
350-----------------------------------------------
351
352When configuring the mode of the adapter, all run-time configured parameters
353are reset to the value used when the module was loaded. This includes
354channels, rates, ESSID, etc.
355
356
3574. About the Version Numbers
236----------------------------------------------- 358-----------------------------------------------
237 359
238Due to the nature of open source development projects, there are 360Due to the nature of open source development projects, there are
@@ -259,12 +381,23 @@ available as quickly as possible, unknown anomalies should be expected.
259The major version number will be incremented when significant changes 381The major version number will be incremented when significant changes
260are made to the driver. Currently, there are no major changes planned. 382are made to the driver. Currently, there are no major changes planned.
261 383
3845. Firmware installation
385----------------------------------------------
386
387The driver requires a firmware image, download it and extract the
388files under /lib/firmware (or wherever your hotplug's firmware.agent
389will look for firmware files)
390
391The firmware can be downloaded from the following URL:
262 392
2633. Support 393 http://ipw2200.sf.net/
394
395
3966. Support
264----------------------------------------------- 397-----------------------------------------------
265 398
266For installation support of the 1.0.0 version, you can contact 399For direct support of the 1.0.0 version, you can contact
267http://supportmail.intel.com, or you can use the open source project 400http://supportmail.intel.com, or you can use the open source project
268support. 401support.
269 402
270For general information and support, go to: 403For general information and support, go to:
@@ -272,7 +405,7 @@ For general information and support, go to:
272 http://ipw2200.sf.net/ 405 http://ipw2200.sf.net/
273 406
274 407
2754. License 4087. License
276----------------------------------------------- 409-----------------------------------------------
277 410
278 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. 411 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
@@ -297,4 +430,3 @@ For general information and support, go to:
297 James P. Ketrenos <ipw2100-admin@linux.intel.com> 430 James P. Ketrenos <ipw2100-admin@linux.intel.com>
298 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 431 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
299 432
300
diff --git a/MAINTAINERS b/MAINTAINERS
index 995bfd8e6e7f..5541f9970b87 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1330,6 +1330,24 @@ M: john.ronciak@intel.com
1330W: http://sourceforge.net/projects/e1000/ 1330W: http://sourceforge.net/projects/e1000/
1331S: Supported 1331S: Supported
1332 1332
1333INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
1334P: Yi Zhu
1335M: yi.zhu@intel.com
1336P: James Ketrenos
1337M: jketreno@linux.intel.com
1338L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
1339W: http://ipw2100.sourceforge.net
1340S: Supported
1341
1342INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT
1343P: Yi Zhu
1344M: yi.zhu@intel.com
1345P: James Ketrenos
1346M: jketreno@linux.intel.com
1347L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
1348W: http://ipw2200.sourceforge.net
1349S: Supported
1350
1333IOC3 DRIVER 1351IOC3 DRIVER
1334P: Ralf Baechle 1352P: Ralf Baechle
1335M: ralf@linux-mips.org 1353M: ralf@linux-mips.org
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c
index 4f19ac7d63a8..877ac514aa07 100644
--- a/drivers/net/wireless/ipw2100.c
+++ b/drivers/net/wireless/ipw2100.c
@@ -167,17 +167,16 @@ that only one external action is invoked at a time.
167 167
168#include "ipw2100.h" 168#include "ipw2100.h"
169 169
170#define IPW2100_VERSION "1.1.0" 170#define IPW2100_VERSION "1.1.3"
171 171
172#define DRV_NAME "ipw2100" 172#define DRV_NAME "ipw2100"
173#define DRV_VERSION IPW2100_VERSION 173#define DRV_VERSION IPW2100_VERSION
174#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver" 174#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
175#define DRV_COPYRIGHT "Copyright(c) 2003-2004 Intel Corporation" 175#define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation"
176
177 176
178/* Debugging stuff */ 177/* Debugging stuff */
179#ifdef CONFIG_IPW_DEBUG 178#ifdef CONFIG_IPW_DEBUG
180#define CONFIG_IPW2100_RX_DEBUG /* Reception debugging */ 179#define CONFIG_IPW2100_RX_DEBUG /* Reception debugging */
181#endif 180#endif
182 181
183MODULE_DESCRIPTION(DRV_DESCRIPTION); 182MODULE_DESCRIPTION(DRV_DESCRIPTION);
@@ -220,18 +219,18 @@ do { \
220} while (0) 219} while (0)
221#else 220#else
222#define IPW_DEBUG(level, message...) do {} while (0) 221#define IPW_DEBUG(level, message...) do {} while (0)
223#endif /* CONFIG_IPW_DEBUG */ 222#endif /* CONFIG_IPW_DEBUG */
224 223
225#ifdef CONFIG_IPW_DEBUG 224#ifdef CONFIG_IPW_DEBUG
226static const char *command_types[] = { 225static const char *command_types[] = {
227 "undefined", 226 "undefined",
228 "unused", /* HOST_ATTENTION */ 227 "unused", /* HOST_ATTENTION */
229 "HOST_COMPLETE", 228 "HOST_COMPLETE",
230 "unused", /* SLEEP */ 229 "unused", /* SLEEP */
231 "unused", /* HOST_POWER_DOWN */ 230 "unused", /* HOST_POWER_DOWN */
232 "unused", 231 "unused",
233 "SYSTEM_CONFIG", 232 "SYSTEM_CONFIG",
234 "unused", /* SET_IMR */ 233 "unused", /* SET_IMR */
235 "SSID", 234 "SSID",
236 "MANDATORY_BSSID", 235 "MANDATORY_BSSID",
237 "AUTHENTICATION_TYPE", 236 "AUTHENTICATION_TYPE",
@@ -277,17 +276,16 @@ static const char *command_types[] = {
277 "GROUP_ORDINALS", 276 "GROUP_ORDINALS",
278 "SHORT_RETRY_LIMIT", 277 "SHORT_RETRY_LIMIT",
279 "LONG_RETRY_LIMIT", 278 "LONG_RETRY_LIMIT",
280 "unused", /* SAVE_CALIBRATION */ 279 "unused", /* SAVE_CALIBRATION */
281 "unused", /* RESTORE_CALIBRATION */ 280 "unused", /* RESTORE_CALIBRATION */
282 "undefined", 281 "undefined",
283 "undefined", 282 "undefined",
284 "undefined", 283 "undefined",
285 "HOST_PRE_POWER_DOWN", 284 "HOST_PRE_POWER_DOWN",
286 "unused", /* HOST_INTERRUPT_COALESCING */ 285 "unused", /* HOST_INTERRUPT_COALESCING */
287 "undefined", 286 "undefined",
288 "CARD_DISABLE_PHY_OFF", 287 "CARD_DISABLE_PHY_OFF",
289 "MSDU_TX_RATES" 288 "MSDU_TX_RATES" "undefined",
290 "undefined",
291 "undefined", 289 "undefined",
292 "SET_STATION_STAT_BITS", 290 "SET_STATION_STAT_BITS",
293 "CLEAR_STATIONS_STAT_BITS", 291 "CLEAR_STATIONS_STAT_BITS",
@@ -298,7 +296,6 @@ static const char *command_types[] = {
298}; 296};
299#endif 297#endif
300 298
301
302/* Pre-decl until we get the code solid and then we can clean it up */ 299/* Pre-decl until we get the code solid and then we can clean it up */
303static void ipw2100_tx_send_commands(struct ipw2100_priv *priv); 300static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
304static void ipw2100_tx_send_data(struct ipw2100_priv *priv); 301static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
@@ -321,11 +318,10 @@ static void ipw2100_release_firmware(struct ipw2100_priv *priv,
321static int ipw2100_ucode_download(struct ipw2100_priv *priv, 318static int ipw2100_ucode_download(struct ipw2100_priv *priv,
322 struct ipw2100_fw *fw); 319 struct ipw2100_fw *fw);
323static void ipw2100_wx_event_work(struct ipw2100_priv *priv); 320static void ipw2100_wx_event_work(struct ipw2100_priv *priv);
324static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev); 321static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev);
325static struct iw_handler_def ipw2100_wx_handler_def; 322static struct iw_handler_def ipw2100_wx_handler_def;
326 323
327 324static inline void read_register(struct net_device *dev, u32 reg, u32 * val)
328static inline void read_register(struct net_device *dev, u32 reg, u32 *val)
329{ 325{
330 *val = readl((void __iomem *)(dev->base_addr + reg)); 326 *val = readl((void __iomem *)(dev->base_addr + reg));
331 IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val); 327 IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val);
@@ -337,13 +333,14 @@ static inline void write_register(struct net_device *dev, u32 reg, u32 val)
337 IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val); 333 IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val);
338} 334}
339 335
340static inline void read_register_word(struct net_device *dev, u32 reg, u16 *val) 336static inline void read_register_word(struct net_device *dev, u32 reg,
337 u16 * val)
341{ 338{
342 *val = readw((void __iomem *)(dev->base_addr + reg)); 339 *val = readw((void __iomem *)(dev->base_addr + reg));
343 IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val); 340 IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val);
344} 341}
345 342
346static inline void read_register_byte(struct net_device *dev, u32 reg, u8 *val) 343static inline void read_register_byte(struct net_device *dev, u32 reg, u8 * val)
347{ 344{
348 *val = readb((void __iomem *)(dev->base_addr + reg)); 345 *val = readb((void __iomem *)(dev->base_addr + reg));
349 IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val); 346 IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val);
@@ -355,14 +352,13 @@ static inline void write_register_word(struct net_device *dev, u32 reg, u16 val)
355 IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val); 352 IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val);
356} 353}
357 354
358
359static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val) 355static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val)
360{ 356{
361 writeb(val, (void __iomem *)(dev->base_addr + reg)); 357 writeb(val, (void __iomem *)(dev->base_addr + reg));
362 IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val); 358 IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val);
363} 359}
364 360
365static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 *val) 361static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 * val)
366{ 362{
367 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, 363 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
368 addr & IPW_REG_INDIRECT_ADDR_MASK); 364 addr & IPW_REG_INDIRECT_ADDR_MASK);
@@ -376,7 +372,7 @@ static inline void write_nic_dword(struct net_device *dev, u32 addr, u32 val)
376 write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val); 372 write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
377} 373}
378 374
379static inline void read_nic_word(struct net_device *dev, u32 addr, u16 *val) 375static inline void read_nic_word(struct net_device *dev, u32 addr, u16 * val)
380{ 376{
381 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, 377 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
382 addr & IPW_REG_INDIRECT_ADDR_MASK); 378 addr & IPW_REG_INDIRECT_ADDR_MASK);
@@ -390,7 +386,7 @@ static inline void write_nic_word(struct net_device *dev, u32 addr, u16 val)
390 write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val); 386 write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
391} 387}
392 388
393static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 *val) 389static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 * val)
394{ 390{
395 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, 391 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
396 addr & IPW_REG_INDIRECT_ADDR_MASK); 392 addr & IPW_REG_INDIRECT_ADDR_MASK);
@@ -416,7 +412,7 @@ static inline void write_nic_dword_auto_inc(struct net_device *dev, u32 val)
416} 412}
417 413
418static inline void write_nic_memory(struct net_device *dev, u32 addr, u32 len, 414static inline void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
419 const u8 *buf) 415 const u8 * buf)
420{ 416{
421 u32 aligned_addr; 417 u32 aligned_addr;
422 u32 aligned_len; 418 u32 aligned_len;
@@ -431,32 +427,30 @@ static inline void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
431 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, 427 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
432 aligned_addr); 428 aligned_addr);
433 for (i = dif_len; i < 4; i++, buf++) 429 for (i = dif_len; i < 4; i++, buf++)
434 write_register_byte( 430 write_register_byte(dev,
435 dev, IPW_REG_INDIRECT_ACCESS_DATA + i, 431 IPW_REG_INDIRECT_ACCESS_DATA + i,
436 *buf); 432 *buf);
437 433
438 len -= dif_len; 434 len -= dif_len;
439 aligned_addr += 4; 435 aligned_addr += 4;
440 } 436 }
441 437
442 /* read DWs through autoincrement registers */ 438 /* read DWs through autoincrement registers */
443 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, 439 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
444 aligned_addr);
445 aligned_len = len & (~0x3); 440 aligned_len = len & (~0x3);
446 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4) 441 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
447 write_register( 442 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *) buf);
448 dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *)buf);
449 443
450 /* copy the last nibble */ 444 /* copy the last nibble */
451 dif_len = len - aligned_len; 445 dif_len = len - aligned_len;
452 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr); 446 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
453 for (i = 0; i < dif_len; i++, buf++) 447 for (i = 0; i < dif_len; i++, buf++)
454 write_register_byte( 448 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i,
455 dev, IPW_REG_INDIRECT_ACCESS_DATA + i, *buf); 449 *buf);
456} 450}
457 451
458static inline void read_nic_memory(struct net_device *dev, u32 addr, u32 len, 452static inline void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
459 u8 *buf) 453 u8 * buf)
460{ 454{
461 u32 aligned_addr; 455 u32 aligned_addr;
462 u32 aligned_len; 456 u32 aligned_len;
@@ -471,39 +465,38 @@ static inline void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
471 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, 465 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
472 aligned_addr); 466 aligned_addr);
473 for (i = dif_len; i < 4; i++, buf++) 467 for (i = dif_len; i < 4; i++, buf++)
474 read_register_byte( 468 read_register_byte(dev,
475 dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf); 469 IPW_REG_INDIRECT_ACCESS_DATA + i,
470 buf);
476 471
477 len -= dif_len; 472 len -= dif_len;
478 aligned_addr += 4; 473 aligned_addr += 4;
479 } 474 }
480 475
481 /* read DWs through autoincrement registers */ 476 /* read DWs through autoincrement registers */
482 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, 477 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
483 aligned_addr);
484 aligned_len = len & (~0x3); 478 aligned_len = len & (~0x3);
485 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4) 479 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
486 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, 480 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, (u32 *) buf);
487 (u32 *)buf);
488 481
489 /* copy the last nibble */ 482 /* copy the last nibble */
490 dif_len = len - aligned_len; 483 dif_len = len - aligned_len;
491 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, 484 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
492 aligned_addr);
493 for (i = 0; i < dif_len; i++, buf++) 485 for (i = 0; i < dif_len; i++, buf++)
494 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + 486 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf);
495 i, buf);
496} 487}
497 488
498static inline int ipw2100_hw_is_adapter_in_system(struct net_device *dev) 489static inline int ipw2100_hw_is_adapter_in_system(struct net_device *dev)
499{ 490{
500 return (dev->base_addr && 491 return (dev->base_addr &&
501 (readl((void __iomem *)(dev->base_addr + IPW_REG_DOA_DEBUG_AREA_START)) 492 (readl
493 ((void __iomem *)(dev->base_addr +
494 IPW_REG_DOA_DEBUG_AREA_START))
502 == IPW_DATA_DOA_DEBUG_VALUE)); 495 == IPW_DATA_DOA_DEBUG_VALUE));
503} 496}
504 497
505static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord, 498static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
506 void *val, u32 *len) 499 void *val, u32 * len)
507{ 500{
508 struct ipw2100_ordinals *ordinals = &priv->ordinals; 501 struct ipw2100_ordinals *ordinals = &priv->ordinals;
509 u32 addr; 502 u32 addr;
@@ -529,8 +522,8 @@ static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
529 return -EINVAL; 522 return -EINVAL;
530 } 523 }
531 524
532 read_nic_dword(priv->net_dev, ordinals->table1_addr + (ord << 2), 525 read_nic_dword(priv->net_dev,
533 &addr); 526 ordinals->table1_addr + (ord << 2), &addr);
534 read_nic_dword(priv->net_dev, addr, val); 527 read_nic_dword(priv->net_dev, addr, val);
535 528
536 *len = IPW_ORD_TAB_1_ENTRY_SIZE; 529 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
@@ -543,8 +536,8 @@ static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
543 ord -= IPW_START_ORD_TAB_2; 536 ord -= IPW_START_ORD_TAB_2;
544 537
545 /* get the address of statistic */ 538 /* get the address of statistic */
546 read_nic_dword(priv->net_dev, ordinals->table2_addr + (ord << 3), 539 read_nic_dword(priv->net_dev,
547 &addr); 540 ordinals->table2_addr + (ord << 3), &addr);
548 541
549 /* get the second DW of statistics ; 542 /* get the second DW of statistics ;
550 * two 16-bit words - first is length, second is count */ 543 * two 16-bit words - first is length, second is count */
@@ -553,10 +546,10 @@ static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
553 &field_info); 546 &field_info);
554 547
555 /* get each entry length */ 548 /* get each entry length */
556 field_len = *((u16 *)&field_info); 549 field_len = *((u16 *) & field_info);
557 550
558 /* get number of entries */ 551 /* get number of entries */
559 field_count = *(((u16 *)&field_info) + 1); 552 field_count = *(((u16 *) & field_info) + 1);
560 553
561 /* abort if no enought memory */ 554 /* abort if no enought memory */
562 total_length = field_len * field_count; 555 total_length = field_len * field_count;
@@ -581,8 +574,8 @@ static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
581 return -EINVAL; 574 return -EINVAL;
582} 575}
583 576
584static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 *val, 577static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val,
585 u32 *len) 578 u32 * len)
586{ 579{
587 struct ipw2100_ordinals *ordinals = &priv->ordinals; 580 struct ipw2100_ordinals *ordinals = &priv->ordinals;
588 u32 addr; 581 u32 addr;
@@ -594,8 +587,8 @@ static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 *val,
594 return -EINVAL; 587 return -EINVAL;
595 } 588 }
596 589
597 read_nic_dword(priv->net_dev, ordinals->table1_addr + (ord << 2), 590 read_nic_dword(priv->net_dev,
598 &addr); 591 ordinals->table1_addr + (ord << 2), &addr);
599 592
600 write_nic_dword(priv->net_dev, addr, *val); 593 write_nic_dword(priv->net_dev, addr, *val);
601 594
@@ -612,7 +605,7 @@ static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 *val,
612} 605}
613 606
614static char *snprint_line(char *buf, size_t count, 607static char *snprint_line(char *buf, size_t count,
615 const u8 *data, u32 len, u32 ofs) 608 const u8 * data, u32 len, u32 ofs)
616{ 609{
617 int out, i, j, l; 610 int out, i, j, l;
618 char c; 611 char c;
@@ -646,7 +639,7 @@ static char *snprint_line(char *buf, size_t count,
646 return buf; 639 return buf;
647} 640}
648 641
649static void printk_buf(int level, const u8 *data, u32 len) 642static void printk_buf(int level, const u8 * data, u32 len)
650{ 643{
651 char line[81]; 644 char line[81];
652 u32 ofs = 0; 645 u32 ofs = 0;
@@ -662,8 +655,6 @@ static void printk_buf(int level, const u8 *data, u32 len)
662 } 655 }
663} 656}
664 657
665
666
667#define MAX_RESET_BACKOFF 10 658#define MAX_RESET_BACKOFF 10
668 659
669static inline void schedule_reset(struct ipw2100_priv *priv) 660static inline void schedule_reset(struct ipw2100_priv *priv)
@@ -703,7 +694,7 @@ static inline void schedule_reset(struct ipw2100_priv *priv)
703 694
704#define HOST_COMPLETE_TIMEOUT (2 * HZ) 695#define HOST_COMPLETE_TIMEOUT (2 * HZ)
705static int ipw2100_hw_send_command(struct ipw2100_priv *priv, 696static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
706 struct host_command * cmd) 697 struct host_command *cmd)
707{ 698{
708 struct list_head *element; 699 struct list_head *element;
709 struct ipw2100_tx_packet *packet; 700 struct ipw2100_tx_packet *packet;
@@ -713,25 +704,28 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
713 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n", 704 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n",
714 command_types[cmd->host_command], cmd->host_command, 705 command_types[cmd->host_command], cmd->host_command,
715 cmd->host_command_length); 706 cmd->host_command_length);
716 printk_buf(IPW_DL_HC, (u8*)cmd->host_command_parameters, 707 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters,
717 cmd->host_command_length); 708 cmd->host_command_length);
718 709
719 spin_lock_irqsave(&priv->low_lock, flags); 710 spin_lock_irqsave(&priv->low_lock, flags);
720 711
721 if (priv->fatal_error) { 712 if (priv->fatal_error) {
722 IPW_DEBUG_INFO("Attempt to send command while hardware in fatal error condition.\n"); 713 IPW_DEBUG_INFO
714 ("Attempt to send command while hardware in fatal error condition.\n");
723 err = -EIO; 715 err = -EIO;
724 goto fail_unlock; 716 goto fail_unlock;
725 } 717 }
726 718
727 if (!(priv->status & STATUS_RUNNING)) { 719 if (!(priv->status & STATUS_RUNNING)) {
728 IPW_DEBUG_INFO("Attempt to send command while hardware is not running.\n"); 720 IPW_DEBUG_INFO
721 ("Attempt to send command while hardware is not running.\n");
729 err = -EIO; 722 err = -EIO;
730 goto fail_unlock; 723 goto fail_unlock;
731 } 724 }
732 725
733 if (priv->status & STATUS_CMD_ACTIVE) { 726 if (priv->status & STATUS_CMD_ACTIVE) {
734 IPW_DEBUG_INFO("Attempt to send command while another command is pending.\n"); 727 IPW_DEBUG_INFO
728 ("Attempt to send command while another command is pending.\n");
735 err = -EBUSY; 729 err = -EBUSY;
736 goto fail_unlock; 730 goto fail_unlock;
737 } 731 }
@@ -752,7 +746,8 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
752 /* initialize the firmware command packet */ 746 /* initialize the firmware command packet */
753 packet->info.c_struct.cmd->host_command_reg = cmd->host_command; 747 packet->info.c_struct.cmd->host_command_reg = cmd->host_command;
754 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1; 748 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1;
755 packet->info.c_struct.cmd->host_command_len_reg = cmd->host_command_length; 749 packet->info.c_struct.cmd->host_command_len_reg =
750 cmd->host_command_length;
756 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence; 751 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence;
757 752
758 memcpy(packet->info.c_struct.cmd->host_command_params_reg, 753 memcpy(packet->info.c_struct.cmd->host_command_params_reg,
@@ -776,13 +771,15 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
776 * then there is a problem. 771 * then there is a problem.
777 */ 772 */
778 773
779 err = wait_event_interruptible_timeout( 774 err =
780 priv->wait_command_queue, !(priv->status & STATUS_CMD_ACTIVE), 775 wait_event_interruptible_timeout(priv->wait_command_queue,
781 HOST_COMPLETE_TIMEOUT); 776 !(priv->
777 status & STATUS_CMD_ACTIVE),
778 HOST_COMPLETE_TIMEOUT);
782 779
783 if (err == 0) { 780 if (err == 0) {
784 IPW_DEBUG_INFO("Command completion failed out after %dms.\n", 781 IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
785 HOST_COMPLETE_TIMEOUT / (HZ / 100)); 782 1000 * (HOST_COMPLETE_TIMEOUT / HZ));
786 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT; 783 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT;
787 priv->status &= ~STATUS_CMD_ACTIVE; 784 priv->status &= ~STATUS_CMD_ACTIVE;
788 schedule_reset(priv); 785 schedule_reset(priv);
@@ -804,13 +801,12 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
804 801
805 return 0; 802 return 0;
806 803
807 fail_unlock: 804 fail_unlock:
808 spin_unlock_irqrestore(&priv->low_lock, flags); 805 spin_unlock_irqrestore(&priv->low_lock, flags);
809 806
810 return err; 807 return err;
811} 808}
812 809
813
814/* 810/*
815 * Verify the values and data access of the hardware 811 * Verify the values and data access of the hardware
816 * No locks needed or used. No functions called. 812 * No locks needed or used. No functions called.
@@ -825,8 +821,7 @@ static int ipw2100_verify(struct ipw2100_priv *priv)
825 821
826 /* Domain 0 check - all values should be DOA_DEBUG */ 822 /* Domain 0 check - all values should be DOA_DEBUG */
827 for (address = IPW_REG_DOA_DEBUG_AREA_START; 823 for (address = IPW_REG_DOA_DEBUG_AREA_START;
828 address < IPW_REG_DOA_DEBUG_AREA_END; 824 address < IPW_REG_DOA_DEBUG_AREA_END; address += sizeof(u32)) {
829 address += sizeof(u32)) {
830 read_register(priv->net_dev, address, &data1); 825 read_register(priv->net_dev, address, &data1);
831 if (data1 != IPW_DATA_DOA_DEBUG_VALUE) 826 if (data1 != IPW_DATA_DOA_DEBUG_VALUE)
832 return -EIO; 827 return -EIO;
@@ -898,7 +893,6 @@ static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state)
898 return -EIO; 893 return -EIO;
899} 894}
900 895
901
902/********************************************************************* 896/*********************************************************************
903 Procedure : sw_reset_and_clock 897 Procedure : sw_reset_and_clock
904 Purpose : Asserts s/w reset, asserts clock initialization 898 Purpose : Asserts s/w reset, asserts clock initialization
@@ -975,17 +969,16 @@ static int ipw2100_download_firmware(struct ipw2100_priv *priv)
975 969
976 if (priv->fatal_error) { 970 if (priv->fatal_error) {
977 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after " 971 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after "
978 "fatal error %d. Interface must be brought down.\n", 972 "fatal error %d. Interface must be brought down.\n",
979 priv->net_dev->name, priv->fatal_error); 973 priv->net_dev->name, priv->fatal_error);
980 return -EINVAL; 974 return -EINVAL;
981 } 975 }
982
983#ifdef CONFIG_PM 976#ifdef CONFIG_PM
984 if (!ipw2100_firmware.version) { 977 if (!ipw2100_firmware.version) {
985 err = ipw2100_get_firmware(priv, &ipw2100_firmware); 978 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
986 if (err) { 979 if (err) {
987 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n", 980 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
988 priv->net_dev->name, err); 981 priv->net_dev->name, err);
989 priv->fatal_error = IPW2100_ERR_FW_LOAD; 982 priv->fatal_error = IPW2100_ERR_FW_LOAD;
990 goto fail; 983 goto fail;
991 } 984 }
@@ -994,7 +987,7 @@ static int ipw2100_download_firmware(struct ipw2100_priv *priv)
994 err = ipw2100_get_firmware(priv, &ipw2100_firmware); 987 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
995 if (err) { 988 if (err) {
996 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n", 989 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
997 priv->net_dev->name, err); 990 priv->net_dev->name, err);
998 priv->fatal_error = IPW2100_ERR_FW_LOAD; 991 priv->fatal_error = IPW2100_ERR_FW_LOAD;
999 goto fail; 992 goto fail;
1000 } 993 }
@@ -1005,21 +998,20 @@ static int ipw2100_download_firmware(struct ipw2100_priv *priv)
1005 err = sw_reset_and_clock(priv); 998 err = sw_reset_and_clock(priv);
1006 if (err) { 999 if (err) {
1007 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n", 1000 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n",
1008 priv->net_dev->name, err); 1001 priv->net_dev->name, err);
1009 goto fail; 1002 goto fail;
1010 } 1003 }
1011 1004
1012 err = ipw2100_verify(priv); 1005 err = ipw2100_verify(priv);
1013 if (err) { 1006 if (err) {
1014 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n", 1007 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n",
1015 priv->net_dev->name, err); 1008 priv->net_dev->name, err);
1016 goto fail; 1009 goto fail;
1017 } 1010 }
1018 1011
1019 /* Hold ARC */ 1012 /* Hold ARC */
1020 write_nic_dword(priv->net_dev, 1013 write_nic_dword(priv->net_dev,
1021 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 1014 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1022 0x80000000);
1023 1015
1024 /* allow ARC to run */ 1016 /* allow ARC to run */
1025 write_register(priv->net_dev, IPW_REG_RESET_REG, 0); 1017 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
@@ -1034,13 +1026,13 @@ static int ipw2100_download_firmware(struct ipw2100_priv *priv)
1034 1026
1035 /* release ARC */ 1027 /* release ARC */
1036 write_nic_dword(priv->net_dev, 1028 write_nic_dword(priv->net_dev,
1037 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 1029 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1038 0x00000000);
1039 1030
1040 /* s/w reset and clock stabilization (again!!!) */ 1031 /* s/w reset and clock stabilization (again!!!) */
1041 err = sw_reset_and_clock(priv); 1032 err = sw_reset_and_clock(priv);
1042 if (err) { 1033 if (err) {
1043 printk(KERN_ERR DRV_NAME ": %s: sw_reset_and_clock failed: %d\n", 1034 printk(KERN_ERR DRV_NAME
1035 ": %s: sw_reset_and_clock failed: %d\n",
1044 priv->net_dev->name, err); 1036 priv->net_dev->name, err);
1045 goto fail; 1037 goto fail;
1046 } 1038 }
@@ -1049,10 +1041,9 @@ static int ipw2100_download_firmware(struct ipw2100_priv *priv)
1049 err = ipw2100_fw_download(priv, &ipw2100_firmware); 1041 err = ipw2100_fw_download(priv, &ipw2100_firmware);
1050 if (err) { 1042 if (err) {
1051 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n", 1043 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n",
1052 priv->net_dev->name, err); 1044 priv->net_dev->name, err);
1053 goto fail; 1045 goto fail;
1054 } 1046 }
1055
1056#ifndef CONFIG_PM 1047#ifndef CONFIG_PM
1057 /* 1048 /*
1058 * When the .resume method of the driver is called, the other 1049 * When the .resume method of the driver is called, the other
@@ -1084,7 +1075,7 @@ static int ipw2100_download_firmware(struct ipw2100_priv *priv)
1084 1075
1085 return 0; 1076 return 0;
1086 1077
1087 fail: 1078 fail:
1088 ipw2100_release_firmware(priv, &ipw2100_firmware); 1079 ipw2100_release_firmware(priv, &ipw2100_firmware);
1089 return err; 1080 return err;
1090} 1081}
@@ -1105,7 +1096,6 @@ static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv)
1105 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0); 1096 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0);
1106} 1097}
1107 1098
1108
1109static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv) 1099static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv)
1110{ 1100{
1111 struct ipw2100_ordinals *ord = &priv->ordinals; 1101 struct ipw2100_ordinals *ord = &priv->ordinals;
@@ -1177,11 +1167,10 @@ static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1177 * EEPROM_SRAM_DB_START_ADDRESS using ordinal in ordinal table 1 1167 * EEPROM_SRAM_DB_START_ADDRESS using ordinal in ordinal table 1
1178 */ 1168 */
1179 len = sizeof(addr); 1169 len = sizeof(addr);
1180 if (ipw2100_get_ordinal( 1170 if (ipw2100_get_ordinal
1181 priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, 1171 (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) {
1182 &addr, &len)) {
1183 IPW_DEBUG_INFO("failed querying ordinals at line %d\n", 1172 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1184 __LINE__); 1173 __LINE__);
1185 return -EIO; 1174 return -EIO;
1186 } 1175 }
1187 1176
@@ -1194,7 +1183,7 @@ static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1194 priv->eeprom_version = (val >> 24) & 0xFF; 1183 priv->eeprom_version = (val >> 24) & 0xFF;
1195 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version); 1184 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version);
1196 1185
1197 /* 1186 /*
1198 * HW RF Kill enable is bit 0 in byte at offset 0x21 in firmware 1187 * HW RF Kill enable is bit 0 in byte at offset 0x21 in firmware
1199 * 1188 *
1200 * notice that the EEPROM bit is reverse polarity, i.e. 1189 * notice that the EEPROM bit is reverse polarity, i.e.
@@ -1206,8 +1195,7 @@ static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1206 priv->hw_features |= HW_FEATURE_RFKILL; 1195 priv->hw_features |= HW_FEATURE_RFKILL;
1207 1196
1208 IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n", 1197 IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n",
1209 (priv->hw_features & HW_FEATURE_RFKILL) ? 1198 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not ");
1210 "" : "not ");
1211 1199
1212 return 0; 1200 return 0;
1213} 1201}
@@ -1234,7 +1222,8 @@ static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1234 * fw & dino ucode 1222 * fw & dino ucode
1235 */ 1223 */
1236 if (ipw2100_download_firmware(priv)) { 1224 if (ipw2100_download_firmware(priv)) {
1237 printk(KERN_ERR DRV_NAME ": %s: Failed to power on the adapter.\n", 1225 printk(KERN_ERR DRV_NAME
1226 ": %s: Failed to power on the adapter.\n",
1238 priv->net_dev->name); 1227 priv->net_dev->name);
1239 return -EIO; 1228 return -EIO;
1240 } 1229 }
@@ -1293,7 +1282,8 @@ static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1293 i ? "SUCCESS" : "FAILED"); 1282 i ? "SUCCESS" : "FAILED");
1294 1283
1295 if (!i) { 1284 if (!i) {
1296 printk(KERN_WARNING DRV_NAME ": %s: Firmware did not initialize.\n", 1285 printk(KERN_WARNING DRV_NAME
1286 ": %s: Firmware did not initialize.\n",
1297 priv->net_dev->name); 1287 priv->net_dev->name);
1298 return -EIO; 1288 return -EIO;
1299 } 1289 }
@@ -1326,7 +1316,6 @@ static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv)
1326 priv->fatal_error = 0; 1316 priv->fatal_error = 0;
1327} 1317}
1328 1318
1329
1330/* NOTE: Our interrupt is disabled when this method is called */ 1319/* NOTE: Our interrupt is disabled when this method is called */
1331static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv) 1320static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1332{ 1321{
@@ -1350,19 +1339,19 @@ static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1350 1339
1351 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED) 1340 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1352 break; 1341 break;
1353 } while(i--); 1342 } while (i--);
1354 1343
1355 priv->status &= ~STATUS_RESET_PENDING; 1344 priv->status &= ~STATUS_RESET_PENDING;
1356 1345
1357 if (!i) { 1346 if (!i) {
1358 IPW_DEBUG_INFO("exit - waited too long for master assert stop\n"); 1347 IPW_DEBUG_INFO
1348 ("exit - waited too long for master assert stop\n");
1359 return -EIO; 1349 return -EIO;
1360 } 1350 }
1361 1351
1362 write_register(priv->net_dev, IPW_REG_RESET_REG, 1352 write_register(priv->net_dev, IPW_REG_RESET_REG,
1363 IPW_AUX_HOST_RESET_REG_SW_RESET); 1353 IPW_AUX_HOST_RESET_REG_SW_RESET);
1364 1354
1365
1366 /* Reset any fatal_error conditions */ 1355 /* Reset any fatal_error conditions */
1367 ipw2100_reset_fatalerror(priv); 1356 ipw2100_reset_fatalerror(priv);
1368 1357
@@ -1415,7 +1404,6 @@ static int ipw2100_hw_phy_off(struct ipw2100_priv *priv)
1415 return -EIO; 1404 return -EIO;
1416} 1405}
1417 1406
1418
1419static int ipw2100_enable_adapter(struct ipw2100_priv *priv) 1407static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1420{ 1408{
1421 struct host_command cmd = { 1409 struct host_command cmd = {
@@ -1445,9 +1433,8 @@ static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1445 1433
1446 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED); 1434 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED);
1447 if (err) { 1435 if (err) {
1448 IPW_DEBUG_INFO( 1436 IPW_DEBUG_INFO("%s: card not responding to init command.\n",
1449 "%s: card not responding to init command.\n", 1437 priv->net_dev->name);
1450 priv->net_dev->name);
1451 goto fail_up; 1438 goto fail_up;
1452 } 1439 }
1453 1440
@@ -1456,7 +1443,7 @@ static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1456 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2); 1443 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2);
1457 } 1444 }
1458 1445
1459fail_up: 1446 fail_up:
1460 up(&priv->adapter_sem); 1447 up(&priv->adapter_sem);
1461 return err; 1448 return err;
1462} 1449}
@@ -1488,7 +1475,8 @@ static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1488 1475
1489 err = ipw2100_hw_phy_off(priv); 1476 err = ipw2100_hw_phy_off(priv);
1490 if (err) 1477 if (err)
1491 printk(KERN_WARNING DRV_NAME ": Error disabling radio %d\n", err); 1478 printk(KERN_WARNING DRV_NAME
1479 ": Error disabling radio %d\n", err);
1492 1480
1493 /* 1481 /*
1494 * If in D0-standby mode going directly to D3 may cause a 1482 * If in D0-standby mode going directly to D3 may cause a
@@ -1566,7 +1554,6 @@ static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1566 return 0; 1554 return 0;
1567} 1555}
1568 1556
1569
1570static int ipw2100_disable_adapter(struct ipw2100_priv *priv) 1557static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1571{ 1558{
1572 struct host_command cmd = { 1559 struct host_command cmd = {
@@ -1593,19 +1580,21 @@ static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1593 1580
1594 err = ipw2100_hw_send_command(priv, &cmd); 1581 err = ipw2100_hw_send_command(priv, &cmd);
1595 if (err) { 1582 if (err) {
1596 printk(KERN_WARNING DRV_NAME ": exit - failed to send CARD_DISABLE command\n"); 1583 printk(KERN_WARNING DRV_NAME
1584 ": exit - failed to send CARD_DISABLE command\n");
1597 goto fail_up; 1585 goto fail_up;
1598 } 1586 }
1599 1587
1600 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED); 1588 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED);
1601 if (err) { 1589 if (err) {
1602 printk(KERN_WARNING DRV_NAME ": exit - card failed to change to DISABLED\n"); 1590 printk(KERN_WARNING DRV_NAME
1591 ": exit - card failed to change to DISABLED\n");
1603 goto fail_up; 1592 goto fail_up;
1604 } 1593 }
1605 1594
1606 IPW_DEBUG_INFO("TODO: implement scan state machine\n"); 1595 IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1607 1596
1608fail_up: 1597 fail_up:
1609 up(&priv->adapter_sem); 1598 up(&priv->adapter_sem);
1610 return err; 1599 return err;
1611} 1600}
@@ -1627,7 +1616,7 @@ static int ipw2100_set_scan_options(struct ipw2100_priv *priv)
1627 1616
1628 if (!(priv->config & CFG_ASSOCIATE)) 1617 if (!(priv->config & CFG_ASSOCIATE))
1629 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE; 1618 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE;
1630 if ((priv->sec.flags & SEC_ENABLED) && priv->sec.enabled) 1619 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled)
1631 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL; 1620 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL;
1632 if (priv->config & CFG_PASSIVE_SCAN) 1621 if (priv->config & CFG_PASSIVE_SCAN)
1633 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE; 1622 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE;
@@ -1709,8 +1698,9 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1709 (priv->status & STATUS_RESET_PENDING)) { 1698 (priv->status & STATUS_RESET_PENDING)) {
1710 /* Power cycle the card ... */ 1699 /* Power cycle the card ... */
1711 if (ipw2100_power_cycle_adapter(priv)) { 1700 if (ipw2100_power_cycle_adapter(priv)) {
1712 printk(KERN_WARNING DRV_NAME ": %s: Could not cycle adapter.\n", 1701 printk(KERN_WARNING DRV_NAME
1713 priv->net_dev->name); 1702 ": %s: Could not cycle adapter.\n",
1703 priv->net_dev->name);
1714 rc = 1; 1704 rc = 1;
1715 goto exit; 1705 goto exit;
1716 } 1706 }
@@ -1719,8 +1709,9 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1719 1709
1720 /* Load the firmware, start the clocks, etc. */ 1710 /* Load the firmware, start the clocks, etc. */
1721 if (ipw2100_start_adapter(priv)) { 1711 if (ipw2100_start_adapter(priv)) {
1722 printk(KERN_ERR DRV_NAME ": %s: Failed to start the firmware.\n", 1712 printk(KERN_ERR DRV_NAME
1723 priv->net_dev->name); 1713 ": %s: Failed to start the firmware.\n",
1714 priv->net_dev->name);
1724 rc = 1; 1715 rc = 1;
1725 goto exit; 1716 goto exit;
1726 } 1717 }
@@ -1729,16 +1720,18 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1729 1720
1730 /* Determine capabilities of this particular HW configuration */ 1721 /* Determine capabilities of this particular HW configuration */
1731 if (ipw2100_get_hw_features(priv)) { 1722 if (ipw2100_get_hw_features(priv)) {
1732 printk(KERN_ERR DRV_NAME ": %s: Failed to determine HW features.\n", 1723 printk(KERN_ERR DRV_NAME
1733 priv->net_dev->name); 1724 ": %s: Failed to determine HW features.\n",
1725 priv->net_dev->name);
1734 rc = 1; 1726 rc = 1;
1735 goto exit; 1727 goto exit;
1736 } 1728 }
1737 1729
1738 lock = LOCK_NONE; 1730 lock = LOCK_NONE;
1739 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { 1731 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
1740 printk(KERN_ERR DRV_NAME ": %s: Failed to clear ordinal lock.\n", 1732 printk(KERN_ERR DRV_NAME
1741 priv->net_dev->name); 1733 ": %s: Failed to clear ordinal lock.\n",
1734 priv->net_dev->name);
1742 rc = 1; 1735 rc = 1;
1743 goto exit; 1736 goto exit;
1744 } 1737 }
@@ -1764,7 +1757,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1764 * HOST_COMPLETE */ 1757 * HOST_COMPLETE */
1765 if (ipw2100_adapter_setup(priv)) { 1758 if (ipw2100_adapter_setup(priv)) {
1766 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n", 1759 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1767 priv->net_dev->name); 1760 priv->net_dev->name);
1768 rc = 1; 1761 rc = 1;
1769 goto exit; 1762 goto exit;
1770 } 1763 }
@@ -1773,20 +1766,19 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1773 /* Enable the adapter - sends HOST_COMPLETE */ 1766 /* Enable the adapter - sends HOST_COMPLETE */
1774 if (ipw2100_enable_adapter(priv)) { 1767 if (ipw2100_enable_adapter(priv)) {
1775 printk(KERN_ERR DRV_NAME ": " 1768 printk(KERN_ERR DRV_NAME ": "
1776 "%s: failed in call to enable adapter.\n", 1769 "%s: failed in call to enable adapter.\n",
1777 priv->net_dev->name); 1770 priv->net_dev->name);
1778 ipw2100_hw_stop_adapter(priv); 1771 ipw2100_hw_stop_adapter(priv);
1779 rc = 1; 1772 rc = 1;
1780 goto exit; 1773 goto exit;
1781 } 1774 }
1782 1775
1783
1784 /* Start a scan . . . */ 1776 /* Start a scan . . . */
1785 ipw2100_set_scan_options(priv); 1777 ipw2100_set_scan_options(priv);
1786 ipw2100_start_scan(priv); 1778 ipw2100_start_scan(priv);
1787 } 1779 }
1788 1780
1789 exit: 1781 exit:
1790 return rc; 1782 return rc;
1791} 1783}
1792 1784
@@ -1802,8 +1794,7 @@ static void ipw2100_down(struct ipw2100_priv *priv)
1802 unsigned long flags; 1794 unsigned long flags;
1803 union iwreq_data wrqu = { 1795 union iwreq_data wrqu = {
1804 .ap_addr = { 1796 .ap_addr = {
1805 .sa_family = ARPHRD_ETHER 1797 .sa_family = ARPHRD_ETHER}
1806 }
1807 }; 1798 };
1808 int associated = priv->status & STATUS_ASSOCIATED; 1799 int associated = priv->status & STATUS_ASSOCIATED;
1809 1800
@@ -1842,7 +1833,7 @@ static void ipw2100_down(struct ipw2100_priv *priv)
1842 1833
1843#ifdef ACPI_CSTATE_LIMIT_DEFINED 1834#ifdef ACPI_CSTATE_LIMIT_DEFINED
1844 if (priv->config & CFG_C3_DISABLED) { 1835 if (priv->config & CFG_C3_DISABLED) {
1845 IPW_DEBUG_INFO(DRV_NAME ": Resetting C3 transitions.\n"); 1836 IPW_DEBUG_INFO(": Resetting C3 transitions.\n");
1846 acpi_set_cstate_limit(priv->cstate_limit); 1837 acpi_set_cstate_limit(priv->cstate_limit);
1847 priv->config &= ~CFG_C3_DISABLED; 1838 priv->config &= ~CFG_C3_DISABLED;
1848 } 1839 }
@@ -1862,14 +1853,12 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv)
1862 unsigned long flags; 1853 unsigned long flags;
1863 union iwreq_data wrqu = { 1854 union iwreq_data wrqu = {
1864 .ap_addr = { 1855 .ap_addr = {
1865 .sa_family = ARPHRD_ETHER 1856 .sa_family = ARPHRD_ETHER}
1866 }
1867 }; 1857 };
1868 int associated = priv->status & STATUS_ASSOCIATED; 1858 int associated = priv->status & STATUS_ASSOCIATED;
1869 1859
1870 spin_lock_irqsave(&priv->low_lock, flags); 1860 spin_lock_irqsave(&priv->low_lock, flags);
1871 IPW_DEBUG_INFO(DRV_NAME ": %s: Restarting adapter.\n", 1861 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1872 priv->net_dev->name);
1873 priv->resets++; 1862 priv->resets++;
1874 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); 1863 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1875 priv->status |= STATUS_SECURITY_UPDATED; 1864 priv->status |= STATUS_SECURITY_UPDATED;
@@ -1894,7 +1883,6 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv)
1894 1883
1895} 1884}
1896 1885
1897
1898static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status) 1886static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1899{ 1887{
1900 1888
@@ -1904,7 +1892,7 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1904 u32 txrate; 1892 u32 txrate;
1905 u32 chan; 1893 u32 chan;
1906 char *txratename; 1894 char *txratename;
1907 u8 bssid[ETH_ALEN]; 1895 u8 bssid[ETH_ALEN];
1908 1896
1909 /* 1897 /*
1910 * TBD: BSSID is usually 00:00:00:00:00:00 here and not 1898 * TBD: BSSID is usually 00:00:00:00:00:00 here and not
@@ -1918,16 +1906,15 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1918 essid, &essid_len); 1906 essid, &essid_len);
1919 if (ret) { 1907 if (ret) {
1920 IPW_DEBUG_INFO("failed querying ordinals at line %d\n", 1908 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1921 __LINE__); 1909 __LINE__);
1922 return; 1910 return;
1923 } 1911 }
1924 1912
1925 len = sizeof(u32); 1913 len = sizeof(u32);
1926 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, 1914 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
1927 &txrate, &len);
1928 if (ret) { 1915 if (ret) {
1929 IPW_DEBUG_INFO("failed querying ordinals at line %d\n", 1916 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1930 __LINE__); 1917 __LINE__);
1931 return; 1918 return;
1932 } 1919 }
1933 1920
@@ -1935,19 +1922,18 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1935 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len); 1922 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
1936 if (ret) { 1923 if (ret) {
1937 IPW_DEBUG_INFO("failed querying ordinals at line %d\n", 1924 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1938 __LINE__); 1925 __LINE__);
1939 return; 1926 return;
1940 } 1927 }
1941 len = ETH_ALEN; 1928 len = ETH_ALEN;
1942 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len); 1929 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len);
1943 if (ret) { 1930 if (ret) {
1944 IPW_DEBUG_INFO("failed querying ordinals at line %d\n", 1931 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1945 __LINE__); 1932 __LINE__);
1946 return; 1933 return;
1947 } 1934 }
1948 memcpy(priv->ieee->bssid, bssid, ETH_ALEN); 1935 memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
1949 1936
1950
1951 switch (txrate) { 1937 switch (txrate) {
1952 case TX_RATE_1_MBIT: 1938 case TX_RATE_1_MBIT:
1953 txratename = "1Mbps"; 1939 txratename = "1Mbps";
@@ -1974,7 +1960,7 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1974 1960
1975 /* now we copy read ssid into dev */ 1961 /* now we copy read ssid into dev */
1976 if (!(priv->config & CFG_STATIC_ESSID)) { 1962 if (!(priv->config & CFG_STATIC_ESSID)) {
1977 priv->essid_len = min((u8)essid_len, (u8)IW_ESSID_MAX_SIZE); 1963 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
1978 memcpy(priv->essid, essid, priv->essid_len); 1964 memcpy(priv->essid, essid, priv->essid_len);
1979 } 1965 }
1980 priv->channel = chan; 1966 priv->channel = chan;
@@ -1986,7 +1972,6 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1986 queue_delayed_work(priv->workqueue, &priv->wx_event_work, HZ / 10); 1972 queue_delayed_work(priv->workqueue, &priv->wx_event_work, HZ / 10);
1987} 1973}
1988 1974
1989
1990static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid, 1975static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
1991 int length, int batch_mode) 1976 int length, int batch_mode)
1992{ 1977{
@@ -2001,8 +1986,7 @@ static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2001 IPW_DEBUG_HC("SSID: '%s'\n", escape_essid(essid, ssid_len)); 1986 IPW_DEBUG_HC("SSID: '%s'\n", escape_essid(essid, ssid_len));
2002 1987
2003 if (ssid_len) 1988 if (ssid_len)
2004 memcpy((char*)cmd.host_command_parameters, 1989 memcpy(cmd.host_command_parameters, essid, ssid_len);
2005 essid, ssid_len);
2006 1990
2007 if (!batch_mode) { 1991 if (!batch_mode) {
2008 err = ipw2100_disable_adapter(priv); 1992 err = ipw2100_disable_adapter(priv);
@@ -2014,7 +1998,7 @@ static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2014 * disable auto association -- so we cheat by setting a bogus SSID */ 1998 * disable auto association -- so we cheat by setting a bogus SSID */
2015 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) { 1999 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2016 int i; 2000 int i;
2017 u8 *bogus = (u8*)cmd.host_command_parameters; 2001 u8 *bogus = (u8 *) cmd.host_command_parameters;
2018 for (i = 0; i < IW_ESSID_MAX_SIZE; i++) 2002 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2019 bogus[i] = 0x18 + i; 2003 bogus[i] = 0x18 + i;
2020 cmd.host_command_length = IW_ESSID_MAX_SIZE; 2004 cmd.host_command_length = IW_ESSID_MAX_SIZE;
@@ -2025,8 +2009,7 @@ static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2025 2009
2026 err = ipw2100_hw_send_command(priv, &cmd); 2010 err = ipw2100_hw_send_command(priv, &cmd);
2027 if (!err) { 2011 if (!err) {
2028 memset(priv->essid + ssid_len, 0, 2012 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2029 IW_ESSID_MAX_SIZE - ssid_len);
2030 memcpy(priv->essid, essid, ssid_len); 2013 memcpy(priv->essid, essid, ssid_len);
2031 priv->essid_len = ssid_len; 2014 priv->essid_len = ssid_len;
2032 } 2015 }
@@ -2071,14 +2054,14 @@ static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2071static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status) 2054static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2072{ 2055{
2073 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n", 2056 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2074 priv->net_dev->name); 2057 priv->net_dev->name);
2075 2058
2076 /* RF_KILL is now enabled (else we wouldn't be here) */ 2059 /* RF_KILL is now enabled (else we wouldn't be here) */
2077 priv->status |= STATUS_RF_KILL_HW; 2060 priv->status |= STATUS_RF_KILL_HW;
2078 2061
2079#ifdef ACPI_CSTATE_LIMIT_DEFINED 2062#ifdef ACPI_CSTATE_LIMIT_DEFINED
2080 if (priv->config & CFG_C3_DISABLED) { 2063 if (priv->config & CFG_C3_DISABLED) {
2081 IPW_DEBUG_INFO(DRV_NAME ": Resetting C3 transitions.\n"); 2064 IPW_DEBUG_INFO(": Resetting C3 transitions.\n");
2082 acpi_set_cstate_limit(priv->cstate_limit); 2065 acpi_set_cstate_limit(priv->cstate_limit);
2083 priv->config &= ~CFG_C3_DISABLED; 2066 priv->config &= ~CFG_C3_DISABLED;
2084 } 2067 }
@@ -2102,16 +2085,16 @@ static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2102#define IPW2100_HANDLER(v, f) { v, f, # v } 2085#define IPW2100_HANDLER(v, f) { v, f, # v }
2103struct ipw2100_status_indicator { 2086struct ipw2100_status_indicator {
2104 int status; 2087 int status;
2105 void (*cb)(struct ipw2100_priv *priv, u32 status); 2088 void (*cb) (struct ipw2100_priv * priv, u32 status);
2106 char *name; 2089 char *name;
2107}; 2090};
2108#else 2091#else
2109#define IPW2100_HANDLER(v, f) { v, f } 2092#define IPW2100_HANDLER(v, f) { v, f }
2110struct ipw2100_status_indicator { 2093struct ipw2100_status_indicator {
2111 int status; 2094 int status;
2112 void (*cb)(struct ipw2100_priv *priv, u32 status); 2095 void (*cb) (struct ipw2100_priv * priv, u32 status);
2113}; 2096};
2114#endif /* CONFIG_IPW_DEBUG */ 2097#endif /* CONFIG_IPW_DEBUG */
2115 2098
2116static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status) 2099static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2117{ 2100{
@@ -2135,7 +2118,6 @@ static const struct ipw2100_status_indicator status_handlers[] = {
2135 IPW2100_HANDLER(-1, NULL) 2118 IPW2100_HANDLER(-1, NULL)
2136}; 2119};
2137 2120
2138
2139static void isr_status_change(struct ipw2100_priv *priv, int status) 2121static void isr_status_change(struct ipw2100_priv *priv, int status)
2140{ 2122{
2141 int i; 2123 int i;
@@ -2153,7 +2135,7 @@ static void isr_status_change(struct ipw2100_priv *priv, int status)
2153 for (i = 0; status_handlers[i].status != -1; i++) { 2135 for (i = 0; status_handlers[i].status != -1; i++) {
2154 if (status == status_handlers[i].status) { 2136 if (status == status_handlers[i].status) {
2155 IPW_DEBUG_NOTIF("Status change: %s\n", 2137 IPW_DEBUG_NOTIF("Status change: %s\n",
2156 status_handlers[i].name); 2138 status_handlers[i].name);
2157 if (status_handlers[i].cb) 2139 if (status_handlers[i].cb)
2158 status_handlers[i].cb(priv, status); 2140 status_handlers[i].cb(priv, status);
2159 priv->wstats.status = status; 2141 priv->wstats.status = status;
@@ -2164,9 +2146,8 @@ static void isr_status_change(struct ipw2100_priv *priv, int status)
2164 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status); 2146 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2165} 2147}
2166 2148
2167static void isr_rx_complete_command( 2149static void isr_rx_complete_command(struct ipw2100_priv *priv,
2168 struct ipw2100_priv *priv, 2150 struct ipw2100_cmd_header *cmd)
2169 struct ipw2100_cmd_header *cmd)
2170{ 2151{
2171#ifdef CONFIG_IPW_DEBUG 2152#ifdef CONFIG_IPW_DEBUG
2172 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) { 2153 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
@@ -2196,10 +2177,8 @@ static const char *frame_types[] = {
2196}; 2177};
2197#endif 2178#endif
2198 2179
2199 2180static inline int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2200static inline int ipw2100_alloc_skb( 2181 struct ipw2100_rx_packet *packet)
2201 struct ipw2100_priv *priv,
2202 struct ipw2100_rx_packet *packet)
2203{ 2182{
2204 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx)); 2183 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2205 if (!packet->skb) 2184 if (!packet->skb)
@@ -2215,7 +2194,6 @@ static inline int ipw2100_alloc_skb(
2215 return 0; 2194 return 0;
2216} 2195}
2217 2196
2218
2219#define SEARCH_ERROR 0xffffffff 2197#define SEARCH_ERROR 0xffffffff
2220#define SEARCH_FAIL 0xfffffffe 2198#define SEARCH_FAIL 0xfffffffe
2221#define SEARCH_SUCCESS 0xfffffff0 2199#define SEARCH_SUCCESS 0xfffffff0
@@ -2229,10 +2207,10 @@ static inline int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2229 if (priv->snapshot[0]) 2207 if (priv->snapshot[0])
2230 return 1; 2208 return 1;
2231 for (i = 0; i < 0x30; i++) { 2209 for (i = 0; i < 0x30; i++) {
2232 priv->snapshot[i] = (u8*)kmalloc(0x1000, GFP_ATOMIC); 2210 priv->snapshot[i] = (u8 *) kmalloc(0x1000, GFP_ATOMIC);
2233 if (!priv->snapshot[i]) { 2211 if (!priv->snapshot[i]) {
2234 IPW_DEBUG_INFO("%s: Error allocating snapshot " 2212 IPW_DEBUG_INFO("%s: Error allocating snapshot "
2235 "buffer %d\n", priv->net_dev->name, i); 2213 "buffer %d\n", priv->net_dev->name, i);
2236 while (i > 0) 2214 while (i > 0)
2237 kfree(priv->snapshot[--i]); 2215 kfree(priv->snapshot[--i]);
2238 priv->snapshot[0] = NULL; 2216 priv->snapshot[0] = NULL;
@@ -2253,7 +2231,7 @@ static inline void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2253 priv->snapshot[0] = NULL; 2231 priv->snapshot[0] = NULL;
2254} 2232}
2255 2233
2256static inline u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 *in_buf, 2234static inline u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2257 size_t len, int mode) 2235 size_t len, int mode)
2258{ 2236{
2259 u32 i, j; 2237 u32 i, j;
@@ -2270,9 +2248,9 @@ static inline u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 *in_buf,
2270 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) { 2248 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2271 read_nic_dword(priv->net_dev, i, &tmp); 2249 read_nic_dword(priv->net_dev, i, &tmp);
2272 if (mode == SEARCH_SNAPSHOT) 2250 if (mode == SEARCH_SNAPSHOT)
2273 *(u32 *)SNAPSHOT_ADDR(i) = tmp; 2251 *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2274 if (ret == SEARCH_FAIL) { 2252 if (ret == SEARCH_FAIL) {
2275 d = (u8*)&tmp; 2253 d = (u8 *) & tmp;
2276 for (j = 0; j < 4; j++) { 2254 for (j = 0; j < 4; j++) {
2277 if (*s != *d) { 2255 if (*s != *d) {
2278 s = in_buf; 2256 s = in_buf;
@@ -2310,8 +2288,7 @@ static inline u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 *in_buf,
2310static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH]; 2288static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2311#endif 2289#endif
2312 2290
2313static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv, 2291static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2314 int i)
2315{ 2292{
2316#ifdef CONFIG_IPW_DEBUG_C3 2293#ifdef CONFIG_IPW_DEBUG_C3
2317 struct ipw2100_status *status = &priv->status_queue.drv[i]; 2294 struct ipw2100_status *status = &priv->status_queue.drv[i];
@@ -2322,11 +2299,11 @@ static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv,
2322 int limit; 2299 int limit;
2323#endif 2300#endif
2324 2301
2325 IPW_DEBUG_INFO(DRV_NAME ": PCI latency error detected at " 2302 IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2326 "0x%04zX.\n", i * sizeof(struct ipw2100_status)); 2303 i * sizeof(struct ipw2100_status));
2327 2304
2328#ifdef ACPI_CSTATE_LIMIT_DEFINED 2305#ifdef ACPI_CSTATE_LIMIT_DEFINED
2329 IPW_DEBUG_INFO(DRV_NAME ": Disabling C3 transitions.\n"); 2306 IPW_DEBUG_INFO(": Disabling C3 transitions.\n");
2330 limit = acpi_get_cstate_limit(); 2307 limit = acpi_get_cstate_limit();
2331 if (limit > 2) { 2308 if (limit > 2) {
2332 priv->cstate_limit = limit; 2309 priv->cstate_limit = limit;
@@ -2346,9 +2323,9 @@ static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv,
2346 2323
2347 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED) 2324 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2348 break; 2325 break;
2349 } while (j--); 2326 } while (j--);
2350 2327
2351 match = ipw2100_match_buf(priv, (u8*)status, 2328 match = ipw2100_match_buf(priv, (u8 *) status,
2352 sizeof(struct ipw2100_status), 2329 sizeof(struct ipw2100_status),
2353 SEARCH_SNAPSHOT); 2330 SEARCH_SNAPSHOT);
2354 if (match < SEARCH_SUCCESS) 2331 if (match < SEARCH_SUCCESS)
@@ -2360,7 +2337,7 @@ static inline void ipw2100_corruption_detected(struct ipw2100_priv *priv,
2360 IPW_DEBUG_INFO("%s: No DMA status match in " 2337 IPW_DEBUG_INFO("%s: No DMA status match in "
2361 "Firmware.\n", priv->net_dev->name); 2338 "Firmware.\n", priv->net_dev->name);
2362 2339
2363 printk_buf((u8*)priv->status_queue.drv, 2340 printk_buf((u8 *) priv->status_queue.drv,
2364 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH); 2341 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2365#endif 2342#endif
2366 2343
@@ -2392,26 +2369,26 @@ static inline void isr_rx(struct ipw2100_priv *priv, int i,
2392 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); 2369 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2393 return; 2370 return;
2394 } 2371 }
2395 2372#ifdef CONFIG_IPW2100_MONITOR
2396 if (unlikely(priv->ieee->iw_mode == IW_MODE_MONITOR && 2373 if (unlikely(priv->ieee->iw_mode == IW_MODE_MONITOR &&
2374 priv->config & CFG_CRC_CHECK &&
2397 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { 2375 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2398 IPW_DEBUG_RX("CRC error in packet. Dropping.\n"); 2376 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2399 priv->ieee->stats.rx_errors++; 2377 priv->ieee->stats.rx_errors++;
2400 return; 2378 return;
2401 } 2379 }
2380#endif
2402 2381
2403 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && 2382 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2404 !(priv->status & STATUS_ASSOCIATED))) { 2383 !(priv->status & STATUS_ASSOCIATED))) {
2405 IPW_DEBUG_DROP("Dropping packet while not associated.\n"); 2384 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2406 priv->wstats.discard.misc++; 2385 priv->wstats.discard.misc++;
2407 return; 2386 return;
2408 } 2387 }
2409 2388
2410
2411 pci_unmap_single(priv->pci_dev, 2389 pci_unmap_single(priv->pci_dev,
2412 packet->dma_addr, 2390 packet->dma_addr,
2413 sizeof(struct ipw2100_rx), 2391 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2414 PCI_DMA_FROMDEVICE);
2415 2392
2416 skb_put(packet->skb, status->frame_size); 2393 skb_put(packet->skb, status->frame_size);
2417 2394
@@ -2438,8 +2415,8 @@ static inline void isr_rx(struct ipw2100_priv *priv, int i,
2438 /* We need to allocate a new SKB and attach it to the RDB. */ 2415 /* We need to allocate a new SKB and attach it to the RDB. */
2439 if (unlikely(ipw2100_alloc_skb(priv, packet))) { 2416 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2440 printk(KERN_WARNING DRV_NAME ": " 2417 printk(KERN_WARNING DRV_NAME ": "
2441 "%s: Unable to allocate SKB onto RBD ring - disabling " 2418 "%s: Unable to allocate SKB onto RBD ring - disabling "
2442 "adapter.\n", priv->net_dev->name); 2419 "adapter.\n", priv->net_dev->name);
2443 /* TODO: schedule adapter shutdown */ 2420 /* TODO: schedule adapter shutdown */
2444 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n"); 2421 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2445 } 2422 }
@@ -2534,11 +2511,11 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2534 2511
2535 /* Sync the DMA for the STATUS buffer so CPU is sure to get 2512 /* Sync the DMA for the STATUS buffer so CPU is sure to get
2536 * the correct values */ 2513 * the correct values */
2537 pci_dma_sync_single_for_cpu( 2514 pci_dma_sync_single_for_cpu(priv->pci_dev,
2538 priv->pci_dev, 2515 sq->nic +
2539 sq->nic + sizeof(struct ipw2100_status) * i, 2516 sizeof(struct ipw2100_status) * i,
2540 sizeof(struct ipw2100_status), 2517 sizeof(struct ipw2100_status),
2541 PCI_DMA_FROMDEVICE); 2518 PCI_DMA_FROMDEVICE);
2542 2519
2543 /* Sync the DMA for the RX buffer so CPU is sure to get 2520 /* Sync the DMA for the RX buffer so CPU is sure to get
2544 * the correct values */ 2521 * the correct values */
@@ -2552,8 +2529,7 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2552 } 2529 }
2553 2530
2554 u = packet->rxp; 2531 u = packet->rxp;
2555 frame_type = sq->drv[i].status_fields & 2532 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2556 STATUS_TYPE_MASK;
2557 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM; 2533 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2558 stats.len = sq->drv[i].frame_size; 2534 stats.len = sq->drv[i].frame_size;
2559 2535
@@ -2562,16 +2538,14 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2562 stats.mask |= IEEE80211_STATMASK_RSSI; 2538 stats.mask |= IEEE80211_STATMASK_RSSI;
2563 stats.freq = IEEE80211_24GHZ_BAND; 2539 stats.freq = IEEE80211_24GHZ_BAND;
2564 2540
2565 IPW_DEBUG_RX( 2541 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2566 "%s: '%s' frame type received (%d).\n", 2542 priv->net_dev->name, frame_types[frame_type],
2567 priv->net_dev->name, frame_types[frame_type], 2543 stats.len);
2568 stats.len);
2569 2544
2570 switch (frame_type) { 2545 switch (frame_type) {
2571 case COMMAND_STATUS_VAL: 2546 case COMMAND_STATUS_VAL:
2572 /* Reset Rx watchdog */ 2547 /* Reset Rx watchdog */
2573 isr_rx_complete_command( 2548 isr_rx_complete_command(priv, &u->rx_data.command);
2574 priv, &u->rx_data.command);
2575 break; 2549 break;
2576 2550
2577 case STATUS_CHANGE_VAL: 2551 case STATUS_CHANGE_VAL:
@@ -2588,12 +2562,10 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2588#endif 2562#endif
2589 if (stats.len < sizeof(u->rx_data.header)) 2563 if (stats.len < sizeof(u->rx_data.header))
2590 break; 2564 break;
2591 switch (WLAN_FC_GET_TYPE(u->rx_data.header. 2565 switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_ctl)) {
2592 frame_ctl)) {
2593 case IEEE80211_FTYPE_MGMT: 2566 case IEEE80211_FTYPE_MGMT:
2594 ieee80211_rx_mgt(priv->ieee, 2567 ieee80211_rx_mgt(priv->ieee,
2595 &u->rx_data.header, 2568 &u->rx_data.header, &stats);
2596 &stats);
2597 break; 2569 break;
2598 2570
2599 case IEEE80211_FTYPE_CTL: 2571 case IEEE80211_FTYPE_CTL:
@@ -2607,7 +2579,7 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2607 break; 2579 break;
2608 } 2580 }
2609 2581
2610 increment: 2582 increment:
2611 /* clear status field associated with this RBD */ 2583 /* clear status field associated with this RBD */
2612 rxq->drv[i].status.info.field = 0; 2584 rxq->drv[i].status.info.field = 0;
2613 2585
@@ -2619,12 +2591,10 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2619 rxq->next = (i ? i : rxq->entries) - 1; 2591 rxq->next = (i ? i : rxq->entries) - 1;
2620 2592
2621 write_register(priv->net_dev, 2593 write_register(priv->net_dev,
2622 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, 2594 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2623 rxq->next);
2624 } 2595 }
2625} 2596}
2626 2597
2627
2628/* 2598/*
2629 * __ipw2100_tx_process 2599 * __ipw2100_tx_process
2630 * 2600 *
@@ -2667,7 +2637,7 @@ static inline void __ipw2100_rx_process(struct ipw2100_priv *priv)
2667static inline int __ipw2100_tx_process(struct ipw2100_priv *priv) 2637static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2668{ 2638{
2669 struct ipw2100_bd_queue *txq = &priv->tx_queue; 2639 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2670 struct ipw2100_bd *tbd; 2640 struct ipw2100_bd *tbd;
2671 struct list_head *element; 2641 struct list_head *element;
2672 struct ipw2100_tx_packet *packet; 2642 struct ipw2100_tx_packet *packet;
2673 int descriptors_used; 2643 int descriptors_used;
@@ -2680,7 +2650,7 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2680 element = priv->fw_pend_list.next; 2650 element = priv->fw_pend_list.next;
2681 2651
2682 packet = list_entry(element, struct ipw2100_tx_packet, list); 2652 packet = list_entry(element, struct ipw2100_tx_packet, list);
2683 tbd = &txq->drv[packet->index]; 2653 tbd = &txq->drv[packet->index];
2684 2654
2685 /* Determine how many TBD entries must be finished... */ 2655 /* Determine how many TBD entries must be finished... */
2686 switch (packet->type) { 2656 switch (packet->type) {
@@ -2693,14 +2663,14 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2693 case DATA: 2663 case DATA:
2694 /* DATA uses two slots; advance and loop position. */ 2664 /* DATA uses two slots; advance and loop position. */
2695 descriptors_used = tbd->num_fragments; 2665 descriptors_used = tbd->num_fragments;
2696 frag_num = tbd->num_fragments - 1; 2666 frag_num = tbd->num_fragments - 1;
2697 e = txq->oldest + frag_num; 2667 e = txq->oldest + frag_num;
2698 e %= txq->entries; 2668 e %= txq->entries;
2699 break; 2669 break;
2700 2670
2701 default: 2671 default:
2702 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n", 2672 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2703 priv->net_dev->name); 2673 priv->net_dev->name);
2704 return 0; 2674 return 0;
2705 } 2675 }
2706 2676
@@ -2716,13 +2686,12 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2716 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n", 2686 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2717 priv->net_dev->name); 2687 priv->net_dev->name);
2718 2688
2719 /* 2689 /*
2720 * txq->next is the index of the last packet written txq->oldest is 2690 * txq->next is the index of the last packet written txq->oldest is
2721 * the index of the r is the index of the next packet to be read by 2691 * the index of the r is the index of the next packet to be read by
2722 * firmware 2692 * firmware
2723 */ 2693 */
2724 2694
2725
2726 /* 2695 /*
2727 * Quick graphic to help you visualize the following 2696 * Quick graphic to help you visualize the following
2728 * if / else statement 2697 * if / else statement
@@ -2750,23 +2719,20 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2750#ifdef CONFIG_IPW_DEBUG 2719#ifdef CONFIG_IPW_DEBUG
2751 { 2720 {
2752 int i = txq->oldest; 2721 int i = txq->oldest;
2753 IPW_DEBUG_TX( 2722 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2754 "TX%d V=%p P=%04X T=%04X L=%d\n", i, 2723 &txq->drv[i],
2755 &txq->drv[i], 2724 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2756 (u32)(txq->nic + i * sizeof(struct ipw2100_bd)), 2725 txq->drv[i].host_addr, txq->drv[i].buf_length);
2757 txq->drv[i].host_addr,
2758 txq->drv[i].buf_length);
2759 2726
2760 if (packet->type == DATA) { 2727 if (packet->type == DATA) {
2761 i = (i + 1) % txq->entries; 2728 i = (i + 1) % txq->entries;
2762 2729
2763 IPW_DEBUG_TX( 2730 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2764 "TX%d V=%p P=%04X T=%04X L=%d\n", i, 2731 &txq->drv[i],
2765 &txq->drv[i], 2732 (u32) (txq->nic + i *
2766 (u32)(txq->nic + i * 2733 sizeof(struct ipw2100_bd)),
2767 sizeof(struct ipw2100_bd)), 2734 (u32) txq->drv[i].host_addr,
2768 (u32)txq->drv[i].host_addr, 2735 txq->drv[i].buf_length);
2769 txq->drv[i].buf_length);
2770 } 2736 }
2771 } 2737 }
2772#endif 2738#endif
@@ -2780,23 +2746,18 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2780 priv->net_dev->name, txq->oldest, packet->index); 2746 priv->net_dev->name, txq->oldest, packet->index);
2781 2747
2782 /* DATA packet; we have to unmap and free the SKB */ 2748 /* DATA packet; we have to unmap and free the SKB */
2783 priv->ieee->stats.tx_packets++;
2784 for (i = 0; i < frag_num; i++) { 2749 for (i = 0; i < frag_num; i++) {
2785 tbd = &txq->drv[(packet->index + 1 + i) % 2750 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2786 txq->entries];
2787 2751
2788 IPW_DEBUG_TX( 2752 IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2789 "TX%d P=%08x L=%d\n", 2753 (packet->index + 1 + i) % txq->entries,
2790 (packet->index + 1 + i) % txq->entries, 2754 tbd->host_addr, tbd->buf_length);
2791 tbd->host_addr, tbd->buf_length);
2792 2755
2793 pci_unmap_single(priv->pci_dev, 2756 pci_unmap_single(priv->pci_dev,
2794 tbd->host_addr, 2757 tbd->host_addr,
2795 tbd->buf_length, 2758 tbd->buf_length, PCI_DMA_TODEVICE);
2796 PCI_DMA_TODEVICE);
2797 } 2759 }
2798 2760
2799 priv->ieee->stats.tx_bytes += packet->info.d_struct.txb->payload_size;
2800 ieee80211_txb_free(packet->info.d_struct.txb); 2761 ieee80211_txb_free(packet->info.d_struct.txb);
2801 packet->info.d_struct.txb = NULL; 2762 packet->info.d_struct.txb = NULL;
2802 2763
@@ -2805,13 +2766,8 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2805 2766
2806 /* We have a free slot in the Tx queue, so wake up the 2767 /* We have a free slot in the Tx queue, so wake up the
2807 * transmit layer if it is stopped. */ 2768 * transmit layer if it is stopped. */
2808 if (priv->status & STATUS_ASSOCIATED && 2769 if (priv->status & STATUS_ASSOCIATED)
2809 netif_queue_stopped(priv->net_dev)) {
2810 IPW_DEBUG_INFO(KERN_INFO
2811 "%s: Waking net queue.\n",
2812 priv->net_dev->name);
2813 netif_wake_queue(priv->net_dev); 2770 netif_wake_queue(priv->net_dev);
2814 }
2815 2771
2816 /* A packet was processed by the hardware, so update the 2772 /* A packet was processed by the hardware, so update the
2817 * watchdog */ 2773 * watchdog */
@@ -2829,11 +2785,12 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2829#ifdef CONFIG_IPW_DEBUG 2785#ifdef CONFIG_IPW_DEBUG
2830 if (packet->info.c_struct.cmd->host_command_reg < 2786 if (packet->info.c_struct.cmd->host_command_reg <
2831 sizeof(command_types) / sizeof(*command_types)) 2787 sizeof(command_types) / sizeof(*command_types))
2832 IPW_DEBUG_TX( 2788 IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2833 "Command '%s (%d)' processed: %d.\n", 2789 command_types[packet->info.c_struct.cmd->
2834 command_types[packet->info.c_struct.cmd->host_command_reg], 2790 host_command_reg],
2835 packet->info.c_struct.cmd->host_command_reg, 2791 packet->info.c_struct.cmd->
2836 packet->info.c_struct.cmd->cmd_status_reg); 2792 host_command_reg,
2793 packet->info.c_struct.cmd->cmd_status_reg);
2837#endif 2794#endif
2838 2795
2839 list_add_tail(element, &priv->msg_free_list); 2796 list_add_tail(element, &priv->msg_free_list);
@@ -2848,17 +2805,17 @@ static inline int __ipw2100_tx_process(struct ipw2100_priv *priv)
2848 SET_STAT(&priv->txq_stat, txq->available); 2805 SET_STAT(&priv->txq_stat, txq->available);
2849 2806
2850 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n", 2807 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n",
2851 jiffies - packet->jiffy_start); 2808 jiffies - packet->jiffy_start);
2852 2809
2853 return (!list_empty(&priv->fw_pend_list)); 2810 return (!list_empty(&priv->fw_pend_list));
2854} 2811}
2855 2812
2856
2857static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv) 2813static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
2858{ 2814{
2859 int i = 0; 2815 int i = 0;
2860 2816
2861 while (__ipw2100_tx_process(priv) && i < 200) i++; 2817 while (__ipw2100_tx_process(priv) && i < 200)
2818 i++;
2862 2819
2863 if (i == 200) { 2820 if (i == 200) {
2864 printk(KERN_WARNING DRV_NAME ": " 2821 printk(KERN_WARNING DRV_NAME ": "
@@ -2867,7 +2824,6 @@ static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
2867 } 2824 }
2868} 2825}
2869 2826
2870
2871static void ipw2100_tx_send_commands(struct ipw2100_priv *priv) 2827static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2872{ 2828{
2873 struct list_head *element; 2829 struct list_head *element;
@@ -2892,13 +2848,12 @@ static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2892 list_del(element); 2848 list_del(element);
2893 DEC_STAT(&priv->msg_pend_stat); 2849 DEC_STAT(&priv->msg_pend_stat);
2894 2850
2895 packet = list_entry(element, 2851 packet = list_entry(element, struct ipw2100_tx_packet, list);
2896 struct ipw2100_tx_packet, list);
2897 2852
2898 IPW_DEBUG_TX("using TBD at virt=%p, phys=%p\n", 2853 IPW_DEBUG_TX("using TBD at virt=%p, phys=%p\n",
2899 &txq->drv[txq->next], 2854 &txq->drv[txq->next],
2900 (void*)(txq->nic + txq->next * 2855 (void *)(txq->nic + txq->next *
2901 sizeof(struct ipw2100_bd))); 2856 sizeof(struct ipw2100_bd)));
2902 2857
2903 packet->index = txq->next; 2858 packet->index = txq->next;
2904 2859
@@ -2911,8 +2866,8 @@ static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2911 * with f/w debug version */ 2866 * with f/w debug version */
2912 tbd->num_fragments = 1; 2867 tbd->num_fragments = 1;
2913 tbd->status.info.field = 2868 tbd->status.info.field =
2914 IPW_BD_STATUS_TX_FRAME_COMMAND | 2869 IPW_BD_STATUS_TX_FRAME_COMMAND |
2915 IPW_BD_STATUS_TX_INTERRUPT_ENABLE; 2870 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
2916 2871
2917 /* update TBD queue counters */ 2872 /* update TBD queue counters */
2918 txq->next++; 2873 txq->next++;
@@ -2934,7 +2889,6 @@ static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2934 } 2889 }
2935} 2890}
2936 2891
2937
2938/* 2892/*
2939 * ipw2100_tx_send_data 2893 * ipw2100_tx_send_data
2940 * 2894 *
@@ -2946,7 +2900,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
2946 struct ipw2100_bd_queue *txq = &priv->tx_queue; 2900 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2947 struct ipw2100_bd *tbd; 2901 struct ipw2100_bd *tbd;
2948 int next = txq->next; 2902 int next = txq->next;
2949 int i = 0; 2903 int i = 0;
2950 struct ipw2100_data_header *ipw_hdr; 2904 struct ipw2100_data_header *ipw_hdr;
2951 struct ieee80211_hdr_3addr *hdr; 2905 struct ieee80211_hdr_3addr *hdr;
2952 2906
@@ -2958,20 +2912,18 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
2958 * maintained between the r and w indexes 2912 * maintained between the r and w indexes
2959 */ 2913 */
2960 element = priv->tx_pend_list.next; 2914 element = priv->tx_pend_list.next;
2961 packet = list_entry(element, struct ipw2100_tx_packet, list); 2915 packet = list_entry(element, struct ipw2100_tx_packet, list);
2962 2916
2963 if (unlikely(1 + packet->info.d_struct.txb->nr_frags > 2917 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
2964 IPW_MAX_BDS)) { 2918 IPW_MAX_BDS)) {
2965 /* TODO: Support merging buffers if more than 2919 /* TODO: Support merging buffers if more than
2966 * IPW_MAX_BDS are used */ 2920 * IPW_MAX_BDS are used */
2967 IPW_DEBUG_INFO( 2921 IPW_DEBUG_INFO("%s: Maximum BD theshold exceeded. "
2968 "%s: Maximum BD theshold exceeded. " 2922 "Increase fragmentation level.\n",
2969 "Increase fragmentation level.\n", 2923 priv->net_dev->name);
2970 priv->net_dev->name);
2971 } 2924 }
2972 2925
2973 if (txq->available <= 3 + 2926 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
2974 packet->info.d_struct.txb->nr_frags) {
2975 IPW_DEBUG_TX("no room in tx_queue\n"); 2927 IPW_DEBUG_TX("no room in tx_queue\n");
2976 break; 2928 break;
2977 } 2929 }
@@ -2985,7 +2937,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
2985 2937
2986 ipw_hdr = packet->info.d_struct.data; 2938 ipw_hdr = packet->info.d_struct.data;
2987 hdr = (struct ieee80211_hdr_3addr *)packet->info.d_struct.txb-> 2939 hdr = (struct ieee80211_hdr_3addr *)packet->info.d_struct.txb->
2988 fragments[0]->data; 2940 fragments[0]->data;
2989 2941
2990 if (priv->ieee->iw_mode == IW_MODE_INFRA) { 2942 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
2991 /* To DS: Addr1 = BSSID, Addr2 = SA, 2943 /* To DS: Addr1 = BSSID, Addr2 = SA,
@@ -3007,7 +2959,8 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3007 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted; 2959 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
3008 if (packet->info.d_struct.txb->nr_frags > 1) 2960 if (packet->info.d_struct.txb->nr_frags > 1)
3009 ipw_hdr->fragment_size = 2961 ipw_hdr->fragment_size =
3010 packet->info.d_struct.txb->frag_size - IEEE80211_3ADDR_LEN; 2962 packet->info.d_struct.txb->frag_size -
2963 IEEE80211_3ADDR_LEN;
3011 else 2964 else
3012 ipw_hdr->fragment_size = 0; 2965 ipw_hdr->fragment_size = 0;
3013 2966
@@ -3015,54 +2968,53 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3015 tbd->buf_length = sizeof(struct ipw2100_data_header); 2968 tbd->buf_length = sizeof(struct ipw2100_data_header);
3016 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags; 2969 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
3017 tbd->status.info.field = 2970 tbd->status.info.field =
3018 IPW_BD_STATUS_TX_FRAME_802_3 | 2971 IPW_BD_STATUS_TX_FRAME_802_3 |
3019 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT; 2972 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3020 txq->next++; 2973 txq->next++;
3021 txq->next %= txq->entries; 2974 txq->next %= txq->entries;
3022 2975
3023 IPW_DEBUG_TX( 2976 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
3024 "data header tbd TX%d P=%08x L=%d\n", 2977 packet->index, tbd->host_addr, tbd->buf_length);
3025 packet->index, tbd->host_addr,
3026 tbd->buf_length);
3027#ifdef CONFIG_IPW_DEBUG 2978#ifdef CONFIG_IPW_DEBUG
3028 if (packet->info.d_struct.txb->nr_frags > 1) 2979 if (packet->info.d_struct.txb->nr_frags > 1)
3029 IPW_DEBUG_FRAG("fragment Tx: %d frames\n", 2980 IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
3030 packet->info.d_struct.txb->nr_frags); 2981 packet->info.d_struct.txb->nr_frags);
3031#endif 2982#endif
3032 2983
3033 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) { 2984 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
3034 tbd = &txq->drv[txq->next]; 2985 tbd = &txq->drv[txq->next];
3035 if (i == packet->info.d_struct.txb->nr_frags - 1) 2986 if (i == packet->info.d_struct.txb->nr_frags - 1)
3036 tbd->status.info.field = 2987 tbd->status.info.field =
3037 IPW_BD_STATUS_TX_FRAME_802_3 | 2988 IPW_BD_STATUS_TX_FRAME_802_3 |
3038 IPW_BD_STATUS_TX_INTERRUPT_ENABLE; 2989 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3039 else 2990 else
3040 tbd->status.info.field = 2991 tbd->status.info.field =
3041 IPW_BD_STATUS_TX_FRAME_802_3 | 2992 IPW_BD_STATUS_TX_FRAME_802_3 |
3042 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT; 2993 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3043 2994
3044 tbd->buf_length = packet->info.d_struct.txb-> 2995 tbd->buf_length = packet->info.d_struct.txb->
3045 fragments[i]->len - IEEE80211_3ADDR_LEN; 2996 fragments[i]->len - IEEE80211_3ADDR_LEN;
3046 2997
3047 tbd->host_addr = pci_map_single( 2998 tbd->host_addr = pci_map_single(priv->pci_dev,
3048 priv->pci_dev, 2999 packet->info.d_struct.
3049 packet->info.d_struct.txb->fragments[i]->data + 3000 txb->fragments[i]->
3050 IEEE80211_3ADDR_LEN, 3001 data +
3051 tbd->buf_length, 3002 IEEE80211_3ADDR_LEN,
3052 PCI_DMA_TODEVICE); 3003 tbd->buf_length,
3004 PCI_DMA_TODEVICE);
3053 3005
3054 IPW_DEBUG_TX( 3006 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3055 "data frag tbd TX%d P=%08x L=%d\n", 3007 txq->next, tbd->host_addr,
3056 txq->next, tbd->host_addr, tbd->buf_length); 3008 tbd->buf_length);
3057 3009
3058 pci_dma_sync_single_for_device( 3010 pci_dma_sync_single_for_device(priv->pci_dev,
3059 priv->pci_dev, tbd->host_addr, 3011 tbd->host_addr,
3060 tbd->buf_length, 3012 tbd->buf_length,
3061 PCI_DMA_TODEVICE); 3013 PCI_DMA_TODEVICE);
3062 3014
3063 txq->next++; 3015 txq->next++;
3064 txq->next %= txq->entries; 3016 txq->next %= txq->entries;
3065 } 3017 }
3066 3018
3067 txq->available -= 1 + packet->info.d_struct.txb->nr_frags; 3019 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3068 SET_STAT(&priv->txq_stat, txq->available); 3020 SET_STAT(&priv->txq_stat, txq->available);
@@ -3078,7 +3030,7 @@ static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3078 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX, 3030 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3079 txq->next); 3031 txq->next);
3080 } 3032 }
3081 return; 3033 return;
3082} 3034}
3083 3035
3084static void ipw2100_irq_tasklet(struct ipw2100_priv *priv) 3036static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
@@ -3106,11 +3058,9 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3106 3058
3107 if (inta & IPW2100_INTA_FATAL_ERROR) { 3059 if (inta & IPW2100_INTA_FATAL_ERROR) {
3108 printk(KERN_WARNING DRV_NAME 3060 printk(KERN_WARNING DRV_NAME
3109 ": Fatal interrupt. Scheduling firmware restart.\n"); 3061 ": Fatal interrupt. Scheduling firmware restart.\n");
3110 priv->inta_other++; 3062 priv->inta_other++;
3111 write_register( 3063 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3112 dev, IPW_REG_INTA,
3113 IPW2100_INTA_FATAL_ERROR);
3114 3064
3115 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error); 3065 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3116 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n", 3066 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
@@ -3125,11 +3075,10 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3125 } 3075 }
3126 3076
3127 if (inta & IPW2100_INTA_PARITY_ERROR) { 3077 if (inta & IPW2100_INTA_PARITY_ERROR) {
3128 printk(KERN_ERR DRV_NAME ": ***** PARITY ERROR INTERRUPT !!!! \n"); 3078 printk(KERN_ERR DRV_NAME
3079 ": ***** PARITY ERROR INTERRUPT !!!! \n");
3129 priv->inta_other++; 3080 priv->inta_other++;
3130 write_register( 3081 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3131 dev, IPW_REG_INTA,
3132 IPW2100_INTA_PARITY_ERROR);
3133 } 3082 }
3134 3083
3135 if (inta & IPW2100_INTA_RX_TRANSFER) { 3084 if (inta & IPW2100_INTA_RX_TRANSFER) {
@@ -3137,9 +3086,7 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3137 3086
3138 priv->rx_interrupts++; 3087 priv->rx_interrupts++;
3139 3088
3140 write_register( 3089 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3141 dev, IPW_REG_INTA,
3142 IPW2100_INTA_RX_TRANSFER);
3143 3090
3144 __ipw2100_rx_process(priv); 3091 __ipw2100_rx_process(priv);
3145 __ipw2100_tx_complete(priv); 3092 __ipw2100_tx_complete(priv);
@@ -3150,8 +3097,7 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3150 3097
3151 priv->tx_interrupts++; 3098 priv->tx_interrupts++;
3152 3099
3153 write_register(dev, IPW_REG_INTA, 3100 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3154 IPW2100_INTA_TX_TRANSFER);
3155 3101
3156 __ipw2100_tx_complete(priv); 3102 __ipw2100_tx_complete(priv);
3157 ipw2100_tx_send_commands(priv); 3103 ipw2100_tx_send_commands(priv);
@@ -3161,9 +3107,7 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3161 if (inta & IPW2100_INTA_TX_COMPLETE) { 3107 if (inta & IPW2100_INTA_TX_COMPLETE) {
3162 IPW_DEBUG_ISR("TX complete\n"); 3108 IPW_DEBUG_ISR("TX complete\n");
3163 priv->inta_other++; 3109 priv->inta_other++;
3164 write_register( 3110 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3165 dev, IPW_REG_INTA,
3166 IPW2100_INTA_TX_COMPLETE);
3167 3111
3168 __ipw2100_tx_complete(priv); 3112 __ipw2100_tx_complete(priv);
3169 } 3113 }
@@ -3171,9 +3115,7 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3171 if (inta & IPW2100_INTA_EVENT_INTERRUPT) { 3115 if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3172 /* ipw2100_handle_event(dev); */ 3116 /* ipw2100_handle_event(dev); */
3173 priv->inta_other++; 3117 priv->inta_other++;
3174 write_register( 3118 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3175 dev, IPW_REG_INTA,
3176 IPW2100_INTA_EVENT_INTERRUPT);
3177 } 3119 }
3178 3120
3179 if (inta & IPW2100_INTA_FW_INIT_DONE) { 3121 if (inta & IPW2100_INTA_FW_INIT_DONE) {
@@ -3183,30 +3125,25 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3183 read_register(dev, IPW_REG_INTA, &tmp); 3125 read_register(dev, IPW_REG_INTA, &tmp);
3184 if (tmp & (IPW2100_INTA_FATAL_ERROR | 3126 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3185 IPW2100_INTA_PARITY_ERROR)) { 3127 IPW2100_INTA_PARITY_ERROR)) {
3186 write_register( 3128 write_register(dev, IPW_REG_INTA,
3187 dev, IPW_REG_INTA, 3129 IPW2100_INTA_FATAL_ERROR |
3188 IPW2100_INTA_FATAL_ERROR | 3130 IPW2100_INTA_PARITY_ERROR);
3189 IPW2100_INTA_PARITY_ERROR);
3190 } 3131 }
3191 3132
3192 write_register(dev, IPW_REG_INTA, 3133 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3193 IPW2100_INTA_FW_INIT_DONE);
3194 } 3134 }
3195 3135
3196 if (inta & IPW2100_INTA_STATUS_CHANGE) { 3136 if (inta & IPW2100_INTA_STATUS_CHANGE) {
3197 IPW_DEBUG_ISR("Status change interrupt\n"); 3137 IPW_DEBUG_ISR("Status change interrupt\n");
3198 priv->inta_other++; 3138 priv->inta_other++;
3199 write_register( 3139 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3200 dev, IPW_REG_INTA,
3201 IPW2100_INTA_STATUS_CHANGE);
3202 } 3140 }
3203 3141
3204 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) { 3142 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3205 IPW_DEBUG_ISR("slave host mode interrupt\n"); 3143 IPW_DEBUG_ISR("slave host mode interrupt\n");
3206 priv->inta_other++; 3144 priv->inta_other++;
3207 write_register( 3145 write_register(dev, IPW_REG_INTA,
3208 dev, IPW_REG_INTA, 3146 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3209 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3210 } 3147 }
3211 3148
3212 priv->in_isr--; 3149 priv->in_isr--;
@@ -3217,9 +3154,7 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3217 IPW_DEBUG_ISR("exit\n"); 3154 IPW_DEBUG_ISR("exit\n");
3218} 3155}
3219 3156
3220 3157static irqreturn_t ipw2100_interrupt(int irq, void *data, struct pt_regs *regs)
3221static irqreturn_t ipw2100_interrupt(int irq, void *data,
3222 struct pt_regs *regs)
3223{ 3158{
3224 struct ipw2100_priv *priv = data; 3159 struct ipw2100_priv *priv = data;
3225 u32 inta, inta_mask; 3160 u32 inta, inta_mask;
@@ -3227,7 +3162,7 @@ static irqreturn_t ipw2100_interrupt(int irq, void *data,
3227 if (!data) 3162 if (!data)
3228 return IRQ_NONE; 3163 return IRQ_NONE;
3229 3164
3230 spin_lock(&priv->low_lock); 3165 spin_lock(&priv->low_lock);
3231 3166
3232 /* We check to see if we should be ignoring interrupts before 3167 /* We check to see if we should be ignoring interrupts before
3233 * we touch the hardware. During ucode load if we try and handle 3168 * we touch the hardware. During ucode load if we try and handle
@@ -3261,10 +3196,10 @@ static irqreturn_t ipw2100_interrupt(int irq, void *data,
3261 ipw2100_disable_interrupts(priv); 3196 ipw2100_disable_interrupts(priv);
3262 3197
3263 tasklet_schedule(&priv->irq_tasklet); 3198 tasklet_schedule(&priv->irq_tasklet);
3264 spin_unlock(&priv->low_lock); 3199 spin_unlock(&priv->low_lock);
3265 3200
3266 return IRQ_HANDLED; 3201 return IRQ_HANDLED;
3267 none: 3202 none:
3268 spin_unlock(&priv->low_lock); 3203 spin_unlock(&priv->low_lock);
3269 return IRQ_NONE; 3204 return IRQ_NONE;
3270} 3205}
@@ -3294,10 +3229,8 @@ static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev,
3294 3229
3295 packet->info.d_struct.txb = txb; 3230 packet->info.d_struct.txb = txb;
3296 3231
3297 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", 3232 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3298 txb->fragments[0]->len); 3233 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3299 printk_buf(IPW_DL_TX, txb->fragments[0]->data,
3300 txb->fragments[0]->len);
3301 3234
3302 packet->jiffy_start = jiffies; 3235 packet->jiffy_start = jiffies;
3303 3236
@@ -3312,22 +3245,23 @@ static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev,
3312 spin_unlock_irqrestore(&priv->low_lock, flags); 3245 spin_unlock_irqrestore(&priv->low_lock, flags);
3313 return 0; 3246 return 0;
3314 3247
3315 fail_unlock: 3248 fail_unlock:
3316 netif_stop_queue(dev); 3249 netif_stop_queue(dev);
3317 spin_unlock_irqrestore(&priv->low_lock, flags); 3250 spin_unlock_irqrestore(&priv->low_lock, flags);
3318 return 1; 3251 return 1;
3319} 3252}
3320 3253
3321
3322static int ipw2100_msg_allocate(struct ipw2100_priv *priv) 3254static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3323{ 3255{
3324 int i, j, err = -EINVAL; 3256 int i, j, err = -EINVAL;
3325 void *v; 3257 void *v;
3326 dma_addr_t p; 3258 dma_addr_t p;
3327 3259
3328 priv->msg_buffers = (struct ipw2100_tx_packet *)kmalloc( 3260 priv->msg_buffers =
3329 IPW_COMMAND_POOL_SIZE * sizeof(struct ipw2100_tx_packet), 3261 (struct ipw2100_tx_packet *)kmalloc(IPW_COMMAND_POOL_SIZE *
3330 GFP_KERNEL); 3262 sizeof(struct
3263 ipw2100_tx_packet),
3264 GFP_KERNEL);
3331 if (!priv->msg_buffers) { 3265 if (!priv->msg_buffers) {
3332 printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for msg " 3266 printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for msg "
3333 "buffers.\n", priv->net_dev->name); 3267 "buffers.\n", priv->net_dev->name);
@@ -3335,15 +3269,12 @@ static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3335 } 3269 }
3336 3270
3337 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) { 3271 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3338 v = pci_alloc_consistent( 3272 v = pci_alloc_consistent(priv->pci_dev,
3339 priv->pci_dev, 3273 sizeof(struct ipw2100_cmd_header), &p);
3340 sizeof(struct ipw2100_cmd_header),
3341 &p);
3342 if (!v) { 3274 if (!v) {
3343 printk(KERN_ERR DRV_NAME ": " 3275 printk(KERN_ERR DRV_NAME ": "
3344 "%s: PCI alloc failed for msg " 3276 "%s: PCI alloc failed for msg "
3345 "buffers.\n", 3277 "buffers.\n", priv->net_dev->name);
3346 priv->net_dev->name);
3347 err = -ENOMEM; 3278 err = -ENOMEM;
3348 break; 3279 break;
3349 } 3280 }
@@ -3352,7 +3283,7 @@ static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3352 3283
3353 priv->msg_buffers[i].type = COMMAND; 3284 priv->msg_buffers[i].type = COMMAND;
3354 priv->msg_buffers[i].info.c_struct.cmd = 3285 priv->msg_buffers[i].info.c_struct.cmd =
3355 (struct ipw2100_cmd_header*)v; 3286 (struct ipw2100_cmd_header *)v;
3356 priv->msg_buffers[i].info.c_struct.cmd_phys = p; 3287 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3357 } 3288 }
3358 3289
@@ -3360,11 +3291,11 @@ static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3360 return 0; 3291 return 0;
3361 3292
3362 for (j = 0; j < i; j++) { 3293 for (j = 0; j < i; j++) {
3363 pci_free_consistent( 3294 pci_free_consistent(priv->pci_dev,
3364 priv->pci_dev, 3295 sizeof(struct ipw2100_cmd_header),
3365 sizeof(struct ipw2100_cmd_header), 3296 priv->msg_buffers[j].info.c_struct.cmd,
3366 priv->msg_buffers[j].info.c_struct.cmd, 3297 priv->msg_buffers[j].info.c_struct.
3367 priv->msg_buffers[j].info.c_struct.cmd_phys); 3298 cmd_phys);
3368 } 3299 }
3369 3300
3370 kfree(priv->msg_buffers); 3301 kfree(priv->msg_buffers);
@@ -3398,7 +3329,8 @@ static void ipw2100_msg_free(struct ipw2100_priv *priv)
3398 pci_free_consistent(priv->pci_dev, 3329 pci_free_consistent(priv->pci_dev,
3399 sizeof(struct ipw2100_cmd_header), 3330 sizeof(struct ipw2100_cmd_header),
3400 priv->msg_buffers[i].info.c_struct.cmd, 3331 priv->msg_buffers[i].info.c_struct.cmd,
3401 priv->msg_buffers[i].info.c_struct.cmd_phys); 3332 priv->msg_buffers[i].info.c_struct.
3333 cmd_phys);
3402 } 3334 }
3403 3335
3404 kfree(priv->msg_buffers); 3336 kfree(priv->msg_buffers);
@@ -3424,6 +3356,7 @@ static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3424 3356
3425 return out - buf; 3357 return out - buf;
3426} 3358}
3359
3427static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL); 3360static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL);
3428 3361
3429static ssize_t show_cfg(struct device *d, struct device_attribute *attr, 3362static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
@@ -3432,209 +3365,269 @@ static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3432 struct ipw2100_priv *p = d->driver_data; 3365 struct ipw2100_priv *p = d->driver_data;
3433 return sprintf(buf, "0x%08x\n", (int)p->config); 3366 return sprintf(buf, "0x%08x\n", (int)p->config);
3434} 3367}
3368
3435static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL); 3369static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
3436 3370
3437static ssize_t show_status(struct device *d, struct device_attribute *attr, 3371static ssize_t show_status(struct device *d, struct device_attribute *attr,
3438 char *buf) 3372 char *buf)
3439{ 3373{
3440 struct ipw2100_priv *p = d->driver_data; 3374 struct ipw2100_priv *p = d->driver_data;
3441 return sprintf(buf, "0x%08x\n", (int)p->status); 3375 return sprintf(buf, "0x%08x\n", (int)p->status);
3442} 3376}
3377
3443static DEVICE_ATTR(status, S_IRUGO, show_status, NULL); 3378static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
3444 3379
3445static ssize_t show_capability(struct device *d, struct device_attribute *attr, 3380static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3446 char *buf) 3381 char *buf)
3447{ 3382{
3448 struct ipw2100_priv *p = d->driver_data; 3383 struct ipw2100_priv *p = d->driver_data;
3449 return sprintf(buf, "0x%08x\n", (int)p->capability); 3384 return sprintf(buf, "0x%08x\n", (int)p->capability);
3450} 3385}
3451static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3452 3386
3387static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3453 3388
3454#define IPW2100_REG(x) { IPW_ ##x, #x } 3389#define IPW2100_REG(x) { IPW_ ##x, #x }
3455static const struct { 3390static const struct {
3456 u32 addr; 3391 u32 addr;
3457 const char *name; 3392 const char *name;
3458} hw_data[] = { 3393} hw_data[] = {
3459 IPW2100_REG(REG_GP_CNTRL), 3394IPW2100_REG(REG_GP_CNTRL),
3460 IPW2100_REG(REG_GPIO), 3395 IPW2100_REG(REG_GPIO),
3461 IPW2100_REG(REG_INTA), 3396 IPW2100_REG(REG_INTA),
3462 IPW2100_REG(REG_INTA_MASK), 3397 IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3463 IPW2100_REG(REG_RESET_REG),
3464};
3465#define IPW2100_NIC(x, s) { x, #x, s } 3398#define IPW2100_NIC(x, s) { x, #x, s }
3466static const struct { 3399static const struct {
3467 u32 addr; 3400 u32 addr;
3468 const char *name; 3401 const char *name;
3469 size_t size; 3402 size_t size;
3470} nic_data[] = { 3403} nic_data[] = {
3471 IPW2100_NIC(IPW2100_CONTROL_REG, 2), 3404IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3472 IPW2100_NIC(0x210014, 1), 3405 IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3473 IPW2100_NIC(0x210000, 1),
3474};
3475#define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d } 3406#define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3476static const struct { 3407static const struct {
3477 u8 index; 3408 u8 index;
3478 const char *name; 3409 const char *name;
3479 const char *desc; 3410 const char *desc;
3480} ord_data[] = { 3411} ord_data[] = {
3481 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"), 3412IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3482 IPW2100_ORD(STAT_TX_HOST_COMPLETE, "successful Host Tx's (MSDU)"), 3413 IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3483 IPW2100_ORD(STAT_TX_DIR_DATA, "successful Directed Tx's (MSDU)"), 3414 "successful Host Tx's (MSDU)"),
3484 IPW2100_ORD(STAT_TX_DIR_DATA1, "successful Directed Tx's (MSDU) @ 1MB"), 3415 IPW2100_ORD(STAT_TX_DIR_DATA,
3485 IPW2100_ORD(STAT_TX_DIR_DATA2, "successful Directed Tx's (MSDU) @ 2MB"), 3416 "successful Directed Tx's (MSDU)"),
3486 IPW2100_ORD(STAT_TX_DIR_DATA5_5, "successful Directed Tx's (MSDU) @ 5_5MB"), 3417 IPW2100_ORD(STAT_TX_DIR_DATA1,
3487 IPW2100_ORD(STAT_TX_DIR_DATA11, "successful Directed Tx's (MSDU) @ 11MB"), 3418 "successful Directed Tx's (MSDU) @ 1MB"),
3488 IPW2100_ORD(STAT_TX_NODIR_DATA1, "successful Non_Directed Tx's (MSDU) @ 1MB"), 3419 IPW2100_ORD(STAT_TX_DIR_DATA2,
3489 IPW2100_ORD(STAT_TX_NODIR_DATA2, "successful Non_Directed Tx's (MSDU) @ 2MB"), 3420 "successful Directed Tx's (MSDU) @ 2MB"),
3490 IPW2100_ORD(STAT_TX_NODIR_DATA5_5, "successful Non_Directed Tx's (MSDU) @ 5.5MB"), 3421 IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3491 IPW2100_ORD(STAT_TX_NODIR_DATA11, "successful Non_Directed Tx's (MSDU) @ 11MB"), 3422 "successful Directed Tx's (MSDU) @ 5_5MB"),
3492 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"), 3423 IPW2100_ORD(STAT_TX_DIR_DATA11,
3493 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"), 3424 "successful Directed Tx's (MSDU) @ 11MB"),
3494 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"), 3425 IPW2100_ORD(STAT_TX_NODIR_DATA1,
3495 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"), 3426 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3496 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"), 3427 IPW2100_ORD(STAT_TX_NODIR_DATA2,
3497 IPW2100_ORD(STAT_TX_ASSN_RESP, "successful Association response Tx's"), 3428 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3498 IPW2100_ORD(STAT_TX_REASSN, "successful Reassociation Tx's"), 3429 IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3499 IPW2100_ORD(STAT_TX_REASSN_RESP, "successful Reassociation response Tx's"), 3430 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3500 IPW2100_ORD(STAT_TX_PROBE, "probes successfully transmitted"), 3431 IPW2100_ORD(STAT_TX_NODIR_DATA11,
3501 IPW2100_ORD(STAT_TX_PROBE_RESP, "probe responses successfully transmitted"), 3432 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3502 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"), 3433 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3503 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"), 3434 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3504 IPW2100_ORD(STAT_TX_DISASSN, "successful Disassociation TX"), 3435 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3505 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"), 3436 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3506 IPW2100_ORD(STAT_TX_DEAUTH, "successful Deauthentication TX"), 3437 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3507 IPW2100_ORD(STAT_TX_TOTAL_BYTES, "Total successful Tx data bytes"), 3438 IPW2100_ORD(STAT_TX_ASSN_RESP,
3508 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"), 3439 "successful Association response Tx's"),
3509 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"), 3440 IPW2100_ORD(STAT_TX_REASSN,
3510 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"), 3441 "successful Reassociation Tx's"),
3511 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"), 3442 IPW2100_ORD(STAT_TX_REASSN_RESP,
3512 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"), 3443 "successful Reassociation response Tx's"),
3513 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"), 3444 IPW2100_ORD(STAT_TX_PROBE,
3514 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,"times max tries in a hop failed"), 3445 "probes successfully transmitted"),
3515 IPW2100_ORD(STAT_TX_DISASSN_FAIL, "times disassociation failed"), 3446 IPW2100_ORD(STAT_TX_PROBE_RESP,
3516 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"), 3447 "probe responses successfully transmitted"),
3517 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"), 3448 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3518 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"), 3449 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3519 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"), 3450 IPW2100_ORD(STAT_TX_DISASSN,
3520 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"), 3451 "successful Disassociation TX"),
3521 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"), 3452 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3522 IPW2100_ORD(STAT_RX_DIR_DATA5_5, "directed packets at 5.5MB"), 3453 IPW2100_ORD(STAT_TX_DEAUTH,
3523 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"), 3454 "successful Deauthentication TX"),
3524 IPW2100_ORD(STAT_RX_NODIR_DATA,"nondirected packets"), 3455 IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3525 IPW2100_ORD(STAT_RX_NODIR_DATA1, "nondirected packets at 1MB"), 3456 "Total successful Tx data bytes"),
3526 IPW2100_ORD(STAT_RX_NODIR_DATA2, "nondirected packets at 2MB"), 3457 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3527 IPW2100_ORD(STAT_RX_NODIR_DATA5_5, "nondirected packets at 5.5MB"), 3458 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3528 IPW2100_ORD(STAT_RX_NODIR_DATA11, "nondirected packets at 11MB"), 3459 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3529 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"), 3460 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3530 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), 3461 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3531 IPW2100_ORD(STAT_RX_CTS, "Rx CTS"), 3462 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3532 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"), 3463 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3533 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"), 3464 "times max tries in a hop failed"),
3534 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"), 3465 IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3535 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"), 3466 "times disassociation failed"),
3536 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"), 3467 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3537 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"), 3468 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3538 IPW2100_ORD(STAT_RX_REASSN_RESP, "Reassociation response Rx's"), 3469 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3539 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"), 3470 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3540 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"), 3471 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3541 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"), 3472 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3542 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"), 3473 IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3543 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"), 3474 "directed packets at 5.5MB"),
3544 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"), 3475 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3545 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"), 3476 IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3546 IPW2100_ORD(STAT_RX_TOTAL_BYTES,"Total rx data bytes received"), 3477 IPW2100_ORD(STAT_RX_NODIR_DATA1,
3547 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"), 3478 "nondirected packets at 1MB"),
3548 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"), 3479 IPW2100_ORD(STAT_RX_NODIR_DATA2,
3549 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"), 3480 "nondirected packets at 2MB"),
3550 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"), 3481 IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3551 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"), 3482 "nondirected packets at 5.5MB"),
3552 IPW2100_ORD(STAT_RX_DUPLICATE1, "duplicate rx packets at 1MB"), 3483 IPW2100_ORD(STAT_RX_NODIR_DATA11,
3553 IPW2100_ORD(STAT_RX_DUPLICATE2, "duplicate rx packets at 2MB"), 3484 "nondirected packets at 11MB"),
3554 IPW2100_ORD(STAT_RX_DUPLICATE5_5, "duplicate rx packets at 5.5MB"), 3485 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3555 IPW2100_ORD(STAT_RX_DUPLICATE11, "duplicate rx packets at 11MB"), 3486 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3556 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"), 3487 "Rx CTS"),
3557 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"), 3488 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3558 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"), 3489 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3559 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"), 3490 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3560 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL, "rx frames with invalid protocol"), 3491 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3561 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"), 3492 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3562 IPW2100_ORD(STAT_RX_NO_BUFFER, "rx frames rejected due to no buffer"), 3493 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3563 IPW2100_ORD(STAT_RX_MISSING_FRAG, "rx frames dropped due to missing fragment"), 3494 IPW2100_ORD(STAT_RX_REASSN_RESP,
3564 IPW2100_ORD(STAT_RX_ORPHAN_FRAG, "rx frames dropped due to non-sequential fragment"), 3495 "Reassociation response Rx's"),
3565 IPW2100_ORD(STAT_RX_ORPHAN_FRAME, "rx frames dropped due to unmatched 1st frame"), 3496 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3566 IPW2100_ORD(STAT_RX_FRAG_AGEOUT, "rx frames dropped due to uncompleted frame"), 3497 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3567 IPW2100_ORD(STAT_RX_ICV_ERRORS, "ICV errors during decryption"), 3498 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3568 IPW2100_ORD(STAT_PSP_SUSPENSION,"times adapter suspended"), 3499 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3569 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"), 3500 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3570 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT, "poll response timeouts"), 3501 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3571 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT, "timeouts waiting for last {broad,multi}cast pkt"), 3502 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3572 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"), 3503 IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3573 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"), 3504 "Total rx data bytes received"),
3574 IPW2100_ORD(STAT_PSP_STATION_ID,"PSP Station ID"), 3505 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3575 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"), 3506 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3576 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,"current calculation of % missed beacons"), 3507 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3577 IPW2100_ORD(STAT_PERCENT_RETRIES,"current calculation of % missed tx retries"), 3508 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3578 IPW2100_ORD(ASSOCIATED_AP_PTR, "0 if not associated, else pointer to AP table entry"), 3509 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3579 IPW2100_ORD(AVAILABLE_AP_CNT, "AP's decsribed in the AP table"), 3510 IPW2100_ORD(STAT_RX_DUPLICATE1,
3580 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"), 3511 "duplicate rx packets at 1MB"),
3581 IPW2100_ORD(STAT_AP_ASSNS, "associations"), 3512 IPW2100_ORD(STAT_RX_DUPLICATE2,
3582 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"), 3513 "duplicate rx packets at 2MB"),
3583 IPW2100_ORD(STAT_ASSN_RESP_FAIL,"failures due to response fail"), 3514 IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3584 IPW2100_ORD(STAT_FULL_SCANS, "full scans"), 3515 "duplicate rx packets at 5.5MB"),
3585 IPW2100_ORD(CARD_DISABLED, "Card Disabled"), 3516 IPW2100_ORD(STAT_RX_DUPLICATE11,
3586 IPW2100_ORD(STAT_ROAM_INHIBIT, "times roaming was inhibited due to activity"), 3517 "duplicate rx packets at 11MB"),
3587 IPW2100_ORD(RSSI_AT_ASSN, "RSSI of associated AP at time of association"), 3518 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3588 IPW2100_ORD(STAT_ASSN_CAUSE1, "reassociation: no probe response or TX on hop"), 3519 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"),
3589 IPW2100_ORD(STAT_ASSN_CAUSE2, "reassociation: poor tx/rx quality"), 3520 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"),
3590 IPW2100_ORD(STAT_ASSN_CAUSE3, "reassociation: tx/rx quality (excessive AP load"), 3521 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"),
3591 IPW2100_ORD(STAT_ASSN_CAUSE4, "reassociation: AP RSSI level"), 3522 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3592 IPW2100_ORD(STAT_ASSN_CAUSE5, "reassociations due to load leveling"), 3523 "rx frames with invalid protocol"),
3593 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"), 3524 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3594 IPW2100_ORD(STAT_AUTH_RESP_FAIL,"times authentication response failed"), 3525 IPW2100_ORD(STAT_RX_NO_BUFFER,
3595 IPW2100_ORD(STATION_TABLE_CNT, "entries in association table"), 3526 "rx frames rejected due to no buffer"),
3596 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"), 3527 IPW2100_ORD(STAT_RX_MISSING_FRAG,
3597 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"), 3528 "rx frames dropped due to missing fragment"),
3598 IPW2100_ORD(COUNTRY_CODE, "IEEE country code as recv'd from beacon"), 3529 IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3599 IPW2100_ORD(COUNTRY_CHANNELS, "channels suported by country"), 3530 "rx frames dropped due to non-sequential fragment"),
3600 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"), 3531 IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3601 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"), 3532 "rx frames dropped due to unmatched 1st frame"),
3602 IPW2100_ORD(ANTENNA_DIVERSITY, "TRUE if antenna diversity is disabled"), 3533 IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3603 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"), 3534 "rx frames dropped due to uncompleted frame"),
3604 IPW2100_ORD(OUR_FREQ, "current radio freq lower digits - channel ID"), 3535 IPW2100_ORD(STAT_RX_ICV_ERRORS,
3605 IPW2100_ORD(RTC_TIME, "current RTC time"), 3536 "ICV errors during decryption"),
3606 IPW2100_ORD(PORT_TYPE, "operating mode"), 3537 IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3607 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"), 3538 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3608 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"), 3539 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3609 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"), 3540 "poll response timeouts"),
3610 IPW2100_ORD(BASIC_RATES, "basic tx rates"), 3541 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3611 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"), 3542 "timeouts waiting for last {broad,multi}cast pkt"),
3612 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"), 3543 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3613 IPW2100_ORD(CAPABILITIES, "Management frame capability field"), 3544 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3614 IPW2100_ORD(AUTH_TYPE, "Type of authentication"), 3545 IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3615 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"), 3546 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3616 IPW2100_ORD(RTS_THRESHOLD, "Min packet length for RTS handshaking"), 3547 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3617 IPW2100_ORD(INT_MODE, "International mode"), 3548 "current calculation of % missed beacons"),
3618 IPW2100_ORD(FRAGMENTATION_THRESHOLD, "protocol frag threshold"), 3549 IPW2100_ORD(STAT_PERCENT_RETRIES,
3619 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS, "EEPROM offset in SRAM"), 3550 "current calculation of % missed tx retries"),
3620 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE, "EEPROM size in SRAM"), 3551 IPW2100_ORD(ASSOCIATED_AP_PTR,
3621 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"), 3552 "0 if not associated, else pointer to AP table entry"),
3622 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS, "EEPROM IBSS 11b channel set"), 3553 IPW2100_ORD(AVAILABLE_AP_CNT,
3623 IPW2100_ORD(MAC_VERSION, "MAC Version"), 3554 "AP's decsribed in the AP table"),
3624 IPW2100_ORD(MAC_REVISION, "MAC Revision"), 3555 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3625 IPW2100_ORD(RADIO_VERSION, "Radio Version"), 3556 IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3626 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"), 3557 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3627 IPW2100_ORD(UCODE_VERSION, "Ucode Version"), 3558 IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3628}; 3559 "failures due to response fail"),
3629 3560 IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3561 IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3562 IPW2100_ORD(STAT_ROAM_INHIBIT,
3563 "times roaming was inhibited due to activity"),
3564 IPW2100_ORD(RSSI_AT_ASSN,
3565 "RSSI of associated AP at time of association"),
3566 IPW2100_ORD(STAT_ASSN_CAUSE1,
3567 "reassociation: no probe response or TX on hop"),
3568 IPW2100_ORD(STAT_ASSN_CAUSE2,
3569 "reassociation: poor tx/rx quality"),
3570 IPW2100_ORD(STAT_ASSN_CAUSE3,
3571 "reassociation: tx/rx quality (excessive AP load"),
3572 IPW2100_ORD(STAT_ASSN_CAUSE4,
3573 "reassociation: AP RSSI level"),
3574 IPW2100_ORD(STAT_ASSN_CAUSE5,
3575 "reassociations due to load leveling"),
3576 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3577 IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3578 "times authentication response failed"),
3579 IPW2100_ORD(STATION_TABLE_CNT,
3580 "entries in association table"),
3581 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3582 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3583 IPW2100_ORD(COUNTRY_CODE,
3584 "IEEE country code as recv'd from beacon"),
3585 IPW2100_ORD(COUNTRY_CHANNELS,
3586 "channels suported by country"),
3587 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3588 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3589 IPW2100_ORD(ANTENNA_DIVERSITY,
3590 "TRUE if antenna diversity is disabled"),
3591 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3592 IPW2100_ORD(OUR_FREQ,
3593 "current radio freq lower digits - channel ID"),
3594 IPW2100_ORD(RTC_TIME, "current RTC time"),
3595 IPW2100_ORD(PORT_TYPE, "operating mode"),
3596 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3597 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3598 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3599 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3600 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3601 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3602 IPW2100_ORD(CAPABILITIES,
3603 "Management frame capability field"),
3604 IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3605 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3606 IPW2100_ORD(RTS_THRESHOLD,
3607 "Min packet length for RTS handshaking"),
3608 IPW2100_ORD(INT_MODE, "International mode"),
3609 IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3610 "protocol frag threshold"),
3611 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3612 "EEPROM offset in SRAM"),
3613 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3614 "EEPROM size in SRAM"),
3615 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3616 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3617 "EEPROM IBSS 11b channel set"),
3618 IPW2100_ORD(MAC_VERSION, "MAC Version"),
3619 IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3620 IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3621 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3622 IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3630 3623
3631static ssize_t show_registers(struct device *d, struct device_attribute *attr, 3624static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3632 char *buf) 3625 char *buf)
3633{ 3626{
3634 int i; 3627 int i;
3635 struct ipw2100_priv *priv = dev_get_drvdata(d); 3628 struct ipw2100_priv *priv = dev_get_drvdata(d);
3636 struct net_device *dev = priv->net_dev; 3629 struct net_device *dev = priv->net_dev;
3637 char * out = buf; 3630 char *out = buf;
3638 u32 val = 0; 3631 u32 val = 0;
3639 3632
3640 out += sprintf(out, "%30s [Address ] : Hex\n", "Register"); 3633 out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
@@ -3647,15 +3640,15 @@ static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3647 3640
3648 return out - buf; 3641 return out - buf;
3649} 3642}
3650static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3651 3643
3644static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3652 3645
3653static ssize_t show_hardware(struct device *d, struct device_attribute *attr, 3646static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3654 char *buf) 3647 char *buf)
3655{ 3648{
3656 struct ipw2100_priv *priv = dev_get_drvdata(d); 3649 struct ipw2100_priv *priv = dev_get_drvdata(d);
3657 struct net_device *dev = priv->net_dev; 3650 struct net_device *dev = priv->net_dev;
3658 char * out = buf; 3651 char *out = buf;
3659 int i; 3652 int i;
3660 3653
3661 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry"); 3654 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
@@ -3688,11 +3681,11 @@ static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3688 } 3681 }
3689 return out - buf; 3682 return out - buf;
3690} 3683}
3691static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3692 3684
3685static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3693 3686
3694static ssize_t show_memory(struct device *d, struct device_attribute *attr, 3687static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3695 char *buf) 3688 char *buf)
3696{ 3689{
3697 struct ipw2100_priv *priv = dev_get_drvdata(d); 3690 struct ipw2100_priv *priv = dev_get_drvdata(d);
3698 struct net_device *dev = priv->net_dev; 3691 struct net_device *dev = priv->net_dev;
@@ -3708,10 +3701,13 @@ static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3708 /* sysfs provides us PAGE_SIZE buffer */ 3701 /* sysfs provides us PAGE_SIZE buffer */
3709 while (len < PAGE_SIZE - 128 && loop < 0x30000) { 3702 while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3710 3703
3711 if (priv->snapshot[0]) for (i = 0; i < 4; i++) 3704 if (priv->snapshot[0])
3712 buffer[i] = *(u32 *)SNAPSHOT_ADDR(loop + i * 4); 3705 for (i = 0; i < 4; i++)
3713 else for (i = 0; i < 4; i++) 3706 buffer[i] =
3714 read_nic_dword(dev, loop + i * 4, &buffer[i]); 3707 *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3708 else
3709 for (i = 0; i < 4; i++)
3710 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3715 3711
3716 if (priv->dump_raw) 3712 if (priv->dump_raw)
3717 len += sprintf(buf + len, 3713 len += sprintf(buf + len,
@@ -3719,26 +3715,26 @@ static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3719 "%c%c%c%c" 3715 "%c%c%c%c"
3720 "%c%c%c%c" 3716 "%c%c%c%c"
3721 "%c%c%c%c", 3717 "%c%c%c%c",
3722 ((u8*)buffer)[0x0], 3718 ((u8 *) buffer)[0x0],
3723 ((u8*)buffer)[0x1], 3719 ((u8 *) buffer)[0x1],
3724 ((u8*)buffer)[0x2], 3720 ((u8 *) buffer)[0x2],
3725 ((u8*)buffer)[0x3], 3721 ((u8 *) buffer)[0x3],
3726 ((u8*)buffer)[0x4], 3722 ((u8 *) buffer)[0x4],
3727 ((u8*)buffer)[0x5], 3723 ((u8 *) buffer)[0x5],
3728 ((u8*)buffer)[0x6], 3724 ((u8 *) buffer)[0x6],
3729 ((u8*)buffer)[0x7], 3725 ((u8 *) buffer)[0x7],
3730 ((u8*)buffer)[0x8], 3726 ((u8 *) buffer)[0x8],
3731 ((u8*)buffer)[0x9], 3727 ((u8 *) buffer)[0x9],
3732 ((u8*)buffer)[0xa], 3728 ((u8 *) buffer)[0xa],
3733 ((u8*)buffer)[0xb], 3729 ((u8 *) buffer)[0xb],
3734 ((u8*)buffer)[0xc], 3730 ((u8 *) buffer)[0xc],
3735 ((u8*)buffer)[0xd], 3731 ((u8 *) buffer)[0xd],
3736 ((u8*)buffer)[0xe], 3732 ((u8 *) buffer)[0xe],
3737 ((u8*)buffer)[0xf]); 3733 ((u8 *) buffer)[0xf]);
3738 else 3734 else
3739 len += sprintf(buf + len, "%s\n", 3735 len += sprintf(buf + len, "%s\n",
3740 snprint_line(line, sizeof(line), 3736 snprint_line(line, sizeof(line),
3741 (u8*)buffer, 16, loop)); 3737 (u8 *) buffer, 16, loop));
3742 loop += 16; 3738 loop += 16;
3743 } 3739 }
3744 3740
@@ -3746,7 +3742,7 @@ static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3746} 3742}
3747 3743
3748static ssize_t store_memory(struct device *d, struct device_attribute *attr, 3744static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3749 const char *buf, size_t count) 3745 const char *buf, size_t count)
3750{ 3746{
3751 struct ipw2100_priv *priv = dev_get_drvdata(d); 3747 struct ipw2100_priv *priv = dev_get_drvdata(d);
3752 struct net_device *dev = priv->net_dev; 3748 struct net_device *dev = priv->net_dev;
@@ -3758,32 +3754,30 @@ static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3758 if (p[0] == '1' || 3754 if (p[0] == '1' ||
3759 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) { 3755 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3760 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n", 3756 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3761 dev->name); 3757 dev->name);
3762 priv->dump_raw = 1; 3758 priv->dump_raw = 1;
3763 3759
3764 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' && 3760 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3765 tolower(p[1]) == 'f')) { 3761 tolower(p[1]) == 'f')) {
3766 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n", 3762 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3767 dev->name); 3763 dev->name);
3768 priv->dump_raw = 0; 3764 priv->dump_raw = 0;
3769 3765
3770 } else if (tolower(p[0]) == 'r') { 3766 } else if (tolower(p[0]) == 'r') {
3771 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", 3767 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3772 dev->name);
3773 ipw2100_snapshot_free(priv); 3768 ipw2100_snapshot_free(priv);
3774 3769
3775 } else 3770 } else
3776 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, " 3771 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3777 "reset = clear memory snapshot\n", 3772 "reset = clear memory snapshot\n", dev->name);
3778 dev->name);
3779 3773
3780 return count; 3774 return count;
3781} 3775}
3782static DEVICE_ATTR(memory, S_IWUSR|S_IRUGO, show_memory, store_memory);
3783 3776
3777static DEVICE_ATTR(memory, S_IWUSR | S_IRUGO, show_memory, store_memory);
3784 3778
3785static ssize_t show_ordinals(struct device *d, struct device_attribute *attr, 3779static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3786 char *buf) 3780 char *buf)
3787{ 3781{
3788 struct ipw2100_priv *priv = dev_get_drvdata(d); 3782 struct ipw2100_priv *priv = dev_get_drvdata(d);
3789 u32 val = 0; 3783 u32 val = 0;
@@ -3791,6 +3785,9 @@ static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3791 u32 val_len; 3785 u32 val_len;
3792 static int loop = 0; 3786 static int loop = 0;
3793 3787
3788 if (priv->status & STATUS_RF_KILL_MASK)
3789 return 0;
3790
3794 if (loop >= sizeof(ord_data) / sizeof(*ord_data)) 3791 if (loop >= sizeof(ord_data) / sizeof(*ord_data))
3795 loop = 0; 3792 loop = 0;
3796 3793
@@ -3814,14 +3811,14 @@ static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3814 3811
3815 return len; 3812 return len;
3816} 3813}
3817static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
3818 3814
3815static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
3819 3816
3820static ssize_t show_stats(struct device *d, struct device_attribute *attr, 3817static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3821 char *buf) 3818 char *buf)
3822{ 3819{
3823 struct ipw2100_priv *priv = dev_get_drvdata(d); 3820 struct ipw2100_priv *priv = dev_get_drvdata(d);
3824 char * out = buf; 3821 char *out = buf;
3825 3822
3826 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n", 3823 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
3827 priv->interrupts, priv->tx_interrupts, 3824 priv->interrupts, priv->tx_interrupts,
@@ -3835,8 +3832,8 @@ static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3835 3832
3836 return out - buf; 3833 return out - buf;
3837} 3834}
3838static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
3839 3835
3836static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
3840 3837
3841static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode) 3838static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3842{ 3839{
@@ -3864,19 +3861,18 @@ static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3864 priv->last_mode = priv->ieee->iw_mode; 3861 priv->last_mode = priv->ieee->iw_mode;
3865 priv->net_dev->type = ARPHRD_IEEE80211; 3862 priv->net_dev->type = ARPHRD_IEEE80211;
3866 break; 3863 break;
3867#endif /* CONFIG_IPW2100_MONITOR */ 3864#endif /* CONFIG_IPW2100_MONITOR */
3868 } 3865 }
3869 3866
3870 priv->ieee->iw_mode = mode; 3867 priv->ieee->iw_mode = mode;
3871 3868
3872#ifdef CONFIG_PM 3869#ifdef CONFIG_PM
3873 /* Indicate ipw2100_download_firmware download firmware 3870 /* Indicate ipw2100_download_firmware download firmware
3874 * from disk instead of memory. */ 3871 * from disk instead of memory. */
3875 ipw2100_firmware.version = 0; 3872 ipw2100_firmware.version = 0;
3876#endif 3873#endif
3877 3874
3878 printk(KERN_INFO "%s: Reseting on mode change.\n", 3875 printk(KERN_INFO "%s: Reseting on mode change.\n", priv->net_dev->name);
3879 priv->net_dev->name);
3880 priv->reset_backoff = 0; 3876 priv->reset_backoff = 0;
3881 schedule_reset(priv); 3877 schedule_reset(priv);
3882 3878
@@ -3884,12 +3880,12 @@ static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3884} 3880}
3885 3881
3886static ssize_t show_internals(struct device *d, struct device_attribute *attr, 3882static ssize_t show_internals(struct device *d, struct device_attribute *attr,
3887 char *buf) 3883 char *buf)
3888{ 3884{
3889 struct ipw2100_priv *priv = dev_get_drvdata(d); 3885 struct ipw2100_priv *priv = dev_get_drvdata(d);
3890 int len = 0; 3886 int len = 0;
3891 3887
3892#define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" # y "\n", priv-> x) 3888#define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
3893 3889
3894 if (priv->status & STATUS_ASSOCIATED) 3890 if (priv->status & STATUS_ASSOCIATED)
3895 len += sprintf(buf + len, "connected: %lu\n", 3891 len += sprintf(buf + len, "connected: %lu\n",
@@ -3897,55 +3893,60 @@ static ssize_t show_internals(struct device *d, struct device_attribute *attr,
3897 else 3893 else
3898 len += sprintf(buf + len, "not connected\n"); 3894 len += sprintf(buf + len, "not connected\n");
3899 3895
3900 DUMP_VAR(ieee->crypt[priv->ieee->tx_keyidx], p); 3896 DUMP_VAR(ieee->crypt[priv->ieee->tx_keyidx], "p");
3901 DUMP_VAR(status, 08lx); 3897 DUMP_VAR(status, "08lx");
3902 DUMP_VAR(config, 08lx); 3898 DUMP_VAR(config, "08lx");
3903 DUMP_VAR(capability, 08lx); 3899 DUMP_VAR(capability, "08lx");
3904 3900
3905 len += sprintf(buf + len, "last_rtc: %lu\n", (unsigned long)priv->last_rtc); 3901 len +=
3902 sprintf(buf + len, "last_rtc: %lu\n",
3903 (unsigned long)priv->last_rtc);
3906 3904
3907 DUMP_VAR(fatal_error, d); 3905 DUMP_VAR(fatal_error, "d");
3908 DUMP_VAR(stop_hang_check, d); 3906 DUMP_VAR(stop_hang_check, "d");
3909 DUMP_VAR(stop_rf_kill, d); 3907 DUMP_VAR(stop_rf_kill, "d");
3910 DUMP_VAR(messages_sent, d); 3908 DUMP_VAR(messages_sent, "d");
3911 3909
3912 DUMP_VAR(tx_pend_stat.value, d); 3910 DUMP_VAR(tx_pend_stat.value, "d");
3913 DUMP_VAR(tx_pend_stat.hi, d); 3911 DUMP_VAR(tx_pend_stat.hi, "d");
3914 3912
3915 DUMP_VAR(tx_free_stat.value, d); 3913 DUMP_VAR(tx_free_stat.value, "d");
3916 DUMP_VAR(tx_free_stat.lo, d); 3914 DUMP_VAR(tx_free_stat.lo, "d");
3917 3915
3918 DUMP_VAR(msg_free_stat.value, d); 3916 DUMP_VAR(msg_free_stat.value, "d");
3919 DUMP_VAR(msg_free_stat.lo, d); 3917 DUMP_VAR(msg_free_stat.lo, "d");
3920 3918
3921 DUMP_VAR(msg_pend_stat.value, d); 3919 DUMP_VAR(msg_pend_stat.value, "d");
3922 DUMP_VAR(msg_pend_stat.hi, d); 3920 DUMP_VAR(msg_pend_stat.hi, "d");
3923 3921
3924 DUMP_VAR(fw_pend_stat.value, d); 3922 DUMP_VAR(fw_pend_stat.value, "d");
3925 DUMP_VAR(fw_pend_stat.hi, d); 3923 DUMP_VAR(fw_pend_stat.hi, "d");
3926 3924
3927 DUMP_VAR(txq_stat.value, d); 3925 DUMP_VAR(txq_stat.value, "d");
3928 DUMP_VAR(txq_stat.lo, d); 3926 DUMP_VAR(txq_stat.lo, "d");
3929 3927
3930 DUMP_VAR(ieee->scans, d); 3928 DUMP_VAR(ieee->scans, "d");
3931 DUMP_VAR(reset_backoff, d); 3929 DUMP_VAR(reset_backoff, "d");
3932 3930
3933 return len; 3931 return len;
3934} 3932}
3935static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
3936 3933
3934static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
3937 3935
3938static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr, 3936static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
3939 char *buf) 3937 char *buf)
3940{ 3938{
3941 struct ipw2100_priv *priv = dev_get_drvdata(d); 3939 struct ipw2100_priv *priv = dev_get_drvdata(d);
3942 char essid[IW_ESSID_MAX_SIZE + 1]; 3940 char essid[IW_ESSID_MAX_SIZE + 1];
3943 u8 bssid[ETH_ALEN]; 3941 u8 bssid[ETH_ALEN];
3944 u32 chan = 0; 3942 u32 chan = 0;
3945 char * out = buf; 3943 char *out = buf;
3946 int length; 3944 int length;
3947 int ret; 3945 int ret;
3948 3946
3947 if (priv->status & STATUS_RF_KILL_MASK)
3948 return 0;
3949
3949 memset(essid, 0, sizeof(essid)); 3950 memset(essid, 0, sizeof(essid));
3950 memset(bssid, 0, sizeof(bssid)); 3951 memset(bssid, 0, sizeof(bssid));
3951 3952
@@ -3976,8 +3977,8 @@ static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
3976 3977
3977 return out - buf; 3978 return out - buf;
3978} 3979}
3979static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
3980 3980
3981static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
3981 3982
3982#ifdef CONFIG_IPW_DEBUG 3983#ifdef CONFIG_IPW_DEBUG
3983static ssize_t show_debug_level(struct device_driver *d, char *buf) 3984static ssize_t show_debug_level(struct device_driver *d, char *buf)
@@ -3985,8 +3986,8 @@ static ssize_t show_debug_level(struct device_driver *d, char *buf)
3985 return sprintf(buf, "0x%08X\n", ipw2100_debug_level); 3986 return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
3986} 3987}
3987 3988
3988static ssize_t store_debug_level(struct device_driver *d, const char *buf, 3989static ssize_t store_debug_level(struct device_driver *d,
3989 size_t count) 3990 const char *buf, size_t count)
3990{ 3991{
3991 char *p = (char *)buf; 3992 char *p = (char *)buf;
3992 u32 val; 3993 u32 val;
@@ -3999,28 +4000,26 @@ static ssize_t store_debug_level(struct device_driver *d, const char *buf,
3999 } else 4000 } else
4000 val = simple_strtoul(p, &p, 10); 4001 val = simple_strtoul(p, &p, 10);
4001 if (p == buf) 4002 if (p == buf)
4002 IPW_DEBUG_INFO(DRV_NAME 4003 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4003 ": %s is not in hex or decimal form.\n", buf);
4004 else 4004 else
4005 ipw2100_debug_level = val; 4005 ipw2100_debug_level = val;
4006 4006
4007 return strnlen(buf, count); 4007 return strnlen(buf, count);
4008} 4008}
4009
4009static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level, 4010static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
4010 store_debug_level); 4011 store_debug_level);
4011#endif /* CONFIG_IPW_DEBUG */ 4012#endif /* CONFIG_IPW_DEBUG */
4012
4013 4013
4014static ssize_t show_fatal_error(struct device *d, 4014static ssize_t show_fatal_error(struct device *d,
4015 struct device_attribute *attr, char *buf) 4015 struct device_attribute *attr, char *buf)
4016{ 4016{
4017 struct ipw2100_priv *priv = dev_get_drvdata(d); 4017 struct ipw2100_priv *priv = dev_get_drvdata(d);
4018 char *out = buf; 4018 char *out = buf;
4019 int i; 4019 int i;
4020 4020
4021 if (priv->fatal_error) 4021 if (priv->fatal_error)
4022 out += sprintf(out, "0x%08X\n", 4022 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4023 priv->fatal_error);
4024 else 4023 else
4025 out += sprintf(out, "0\n"); 4024 out += sprintf(out, "0\n");
4026 4025
@@ -4038,24 +4037,26 @@ static ssize_t show_fatal_error(struct device *d,
4038} 4037}
4039 4038
4040static ssize_t store_fatal_error(struct device *d, 4039static ssize_t store_fatal_error(struct device *d,
4041 struct device_attribute *attr, const char *buf, size_t count) 4040 struct device_attribute *attr, const char *buf,
4041 size_t count)
4042{ 4042{
4043 struct ipw2100_priv *priv = dev_get_drvdata(d); 4043 struct ipw2100_priv *priv = dev_get_drvdata(d);
4044 schedule_reset(priv); 4044 schedule_reset(priv);
4045 return count; 4045 return count;
4046} 4046}
4047static DEVICE_ATTR(fatal_error, S_IWUSR|S_IRUGO, show_fatal_error, store_fatal_error);
4048 4047
4048static DEVICE_ATTR(fatal_error, S_IWUSR | S_IRUGO, show_fatal_error,
4049 store_fatal_error);
4049 4050
4050static ssize_t show_scan_age(struct device *d, struct device_attribute *attr, 4051static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4051 char *buf) 4052 char *buf)
4052{ 4053{
4053 struct ipw2100_priv *priv = dev_get_drvdata(d); 4054 struct ipw2100_priv *priv = dev_get_drvdata(d);
4054 return sprintf(buf, "%d\n", priv->ieee->scan_age); 4055 return sprintf(buf, "%d\n", priv->ieee->scan_age);
4055} 4056}
4056 4057
4057static ssize_t store_scan_age(struct device *d, struct device_attribute *attr, 4058static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4058 const char *buf, size_t count) 4059 const char *buf, size_t count)
4059{ 4060{
4060 struct ipw2100_priv *priv = dev_get_drvdata(d); 4061 struct ipw2100_priv *priv = dev_get_drvdata(d);
4061 struct net_device *dev = priv->net_dev; 4062 struct net_device *dev = priv->net_dev;
@@ -4078,8 +4079,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4078 } else 4079 } else
4079 val = simple_strtoul(p, &p, 10); 4080 val = simple_strtoul(p, &p, 10);
4080 if (p == buffer) { 4081 if (p == buffer) {
4081 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", 4082 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4082 dev->name);
4083 } else { 4083 } else {
4084 priv->ieee->scan_age = val; 4084 priv->ieee->scan_age = val;
4085 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age); 4085 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
@@ -4088,11 +4088,11 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4088 IPW_DEBUG_INFO("exit\n"); 4088 IPW_DEBUG_INFO("exit\n");
4089 return len; 4089 return len;
4090} 4090}
4091static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4092 4091
4092static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4093 4093
4094static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr, 4094static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4095 char *buf) 4095 char *buf)
4096{ 4096{
4097 /* 0 - RF kill not enabled 4097 /* 0 - RF kill not enabled
4098 1 - SW based RF kill active (sysfs) 4098 1 - SW based RF kill active (sysfs)
@@ -4100,7 +4100,7 @@ static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4100 3 - Both HW and SW baed RF kill active */ 4100 3 - Both HW and SW baed RF kill active */
4101 struct ipw2100_priv *priv = (struct ipw2100_priv *)d->driver_data; 4101 struct ipw2100_priv *priv = (struct ipw2100_priv *)d->driver_data;
4102 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) | 4102 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4103 (rf_kill_active(priv) ? 0x2 : 0x0); 4103 (rf_kill_active(priv) ? 0x2 : 0x0);
4104 return sprintf(buf, "%i\n", val); 4104 return sprintf(buf, "%i\n", val);
4105} 4105}
4106 4106
@@ -4108,7 +4108,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4108{ 4108{
4109 if ((disable_radio ? 1 : 0) == 4109 if ((disable_radio ? 1 : 0) ==
4110 (priv->status & STATUS_RF_KILL_SW ? 1 : 0)) 4110 (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4111 return 0 ; 4111 return 0;
4112 4112
4113 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n", 4113 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4114 disable_radio ? "OFF" : "ON"); 4114 disable_radio ? "OFF" : "ON");
@@ -4126,8 +4126,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4126 /* Make sure the RF_KILL check timer is running */ 4126 /* Make sure the RF_KILL check timer is running */
4127 priv->stop_rf_kill = 0; 4127 priv->stop_rf_kill = 0;
4128 cancel_delayed_work(&priv->rf_kill); 4128 cancel_delayed_work(&priv->rf_kill);
4129 queue_delayed_work(priv->workqueue, &priv->rf_kill, 4129 queue_delayed_work(priv->workqueue, &priv->rf_kill, HZ);
4130 HZ);
4131 } else 4130 } else
4132 schedule_reset(priv); 4131 schedule_reset(priv);
4133 } 4132 }
@@ -4137,14 +4136,14 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4137} 4136}
4138 4137
4139static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr, 4138static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4140 const char *buf, size_t count) 4139 const char *buf, size_t count)
4141{ 4140{
4142 struct ipw2100_priv *priv = dev_get_drvdata(d); 4141 struct ipw2100_priv *priv = dev_get_drvdata(d);
4143 ipw_radio_kill_sw(priv, buf[0] == '1'); 4142 ipw_radio_kill_sw(priv, buf[0] == '1');
4144 return count; 4143 return count;
4145} 4144}
4146static DEVICE_ATTR(rf_kill, S_IWUSR|S_IRUGO, show_rf_kill, store_rf_kill);
4147 4145
4146static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
4148 4147
4149static struct attribute *ipw2100_sysfs_entries[] = { 4148static struct attribute *ipw2100_sysfs_entries[] = {
4150 &dev_attr_hardware.attr, 4149 &dev_attr_hardware.attr,
@@ -4168,7 +4167,6 @@ static struct attribute_group ipw2100_attribute_group = {
4168 .attrs = ipw2100_sysfs_entries, 4167 .attrs = ipw2100_sysfs_entries,
4169}; 4168};
4170 4169
4171
4172static int status_queue_allocate(struct ipw2100_priv *priv, int entries) 4170static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4173{ 4171{
4174 struct ipw2100_status_queue *q = &priv->status_queue; 4172 struct ipw2100_status_queue *q = &priv->status_queue;
@@ -4176,11 +4174,11 @@ static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4176 IPW_DEBUG_INFO("enter\n"); 4174 IPW_DEBUG_INFO("enter\n");
4177 4175
4178 q->size = entries * sizeof(struct ipw2100_status); 4176 q->size = entries * sizeof(struct ipw2100_status);
4179 q->drv = (struct ipw2100_status *)pci_alloc_consistent( 4177 q->drv =
4180 priv->pci_dev, q->size, &q->nic); 4178 (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev,
4179 q->size, &q->nic);
4181 if (!q->drv) { 4180 if (!q->drv) {
4182 IPW_DEBUG_WARNING( 4181 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4183 "Can not allocate status queue.\n");
4184 return -ENOMEM; 4182 return -ENOMEM;
4185 } 4183 }
4186 4184
@@ -4196,9 +4194,9 @@ static void status_queue_free(struct ipw2100_priv *priv)
4196 IPW_DEBUG_INFO("enter\n"); 4194 IPW_DEBUG_INFO("enter\n");
4197 4195
4198 if (priv->status_queue.drv) { 4196 if (priv->status_queue.drv) {
4199 pci_free_consistent( 4197 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4200 priv->pci_dev, priv->status_queue.size, 4198 priv->status_queue.drv,
4201 priv->status_queue.drv, priv->status_queue.nic); 4199 priv->status_queue.nic);
4202 priv->status_queue.drv = NULL; 4200 priv->status_queue.drv = NULL;
4203 } 4201 }
4204 4202
@@ -4216,7 +4214,8 @@ static int bd_queue_allocate(struct ipw2100_priv *priv,
4216 q->size = entries * sizeof(struct ipw2100_bd); 4214 q->size = entries * sizeof(struct ipw2100_bd);
4217 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic); 4215 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic);
4218 if (!q->drv) { 4216 if (!q->drv) {
4219 IPW_DEBUG_INFO("can't allocate shared memory for buffer descriptors\n"); 4217 IPW_DEBUG_INFO
4218 ("can't allocate shared memory for buffer descriptors\n");
4220 return -ENOMEM; 4219 return -ENOMEM;
4221 } 4220 }
4222 memset(q->drv, 0, q->size); 4221 memset(q->drv, 0, q->size);
@@ -4226,8 +4225,7 @@ static int bd_queue_allocate(struct ipw2100_priv *priv,
4226 return 0; 4225 return 0;
4227} 4226}
4228 4227
4229static void bd_queue_free(struct ipw2100_priv *priv, 4228static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4230 struct ipw2100_bd_queue *q)
4231{ 4229{
4232 IPW_DEBUG_INFO("enter\n"); 4230 IPW_DEBUG_INFO("enter\n");
4233 4231
@@ -4235,21 +4233,21 @@ static void bd_queue_free(struct ipw2100_priv *priv,
4235 return; 4233 return;
4236 4234
4237 if (q->drv) { 4235 if (q->drv) {
4238 pci_free_consistent(priv->pci_dev, 4236 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4239 q->size, q->drv, q->nic);
4240 q->drv = NULL; 4237 q->drv = NULL;
4241 } 4238 }
4242 4239
4243 IPW_DEBUG_INFO("exit\n"); 4240 IPW_DEBUG_INFO("exit\n");
4244} 4241}
4245 4242
4246static void bd_queue_initialize( 4243static void bd_queue_initialize(struct ipw2100_priv *priv,
4247 struct ipw2100_priv *priv, struct ipw2100_bd_queue * q, 4244 struct ipw2100_bd_queue *q, u32 base, u32 size,
4248 u32 base, u32 size, u32 r, u32 w) 4245 u32 r, u32 w)
4249{ 4246{
4250 IPW_DEBUG_INFO("enter\n"); 4247 IPW_DEBUG_INFO("enter\n");
4251 4248
4252 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv, (u32)q->nic); 4249 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4250 (u32) q->nic);
4253 4251
4254 write_register(priv->net_dev, base, q->nic); 4252 write_register(priv->net_dev, base, q->nic);
4255 write_register(priv->net_dev, size, q->entries); 4253 write_register(priv->net_dev, size, q->entries);
@@ -4285,32 +4283,38 @@ static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4285 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH); 4283 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4286 if (err) { 4284 if (err) {
4287 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n", 4285 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4288 priv->net_dev->name); 4286 priv->net_dev->name);
4289 return err; 4287 return err;
4290 } 4288 }
4291 4289
4292 priv->tx_buffers = (struct ipw2100_tx_packet *)kmalloc( 4290 priv->tx_buffers =
4293 TX_PENDED_QUEUE_LENGTH * sizeof(struct ipw2100_tx_packet), 4291 (struct ipw2100_tx_packet *)kmalloc(TX_PENDED_QUEUE_LENGTH *
4294 GFP_ATOMIC); 4292 sizeof(struct
4293 ipw2100_tx_packet),
4294 GFP_ATOMIC);
4295 if (!priv->tx_buffers) { 4295 if (!priv->tx_buffers) {
4296 printk(KERN_ERR DRV_NAME ": %s: alloc failed form tx buffers.\n", 4296 printk(KERN_ERR DRV_NAME
4297 ": %s: alloc failed form tx buffers.\n",
4297 priv->net_dev->name); 4298 priv->net_dev->name);
4298 bd_queue_free(priv, &priv->tx_queue); 4299 bd_queue_free(priv, &priv->tx_queue);
4299 return -ENOMEM; 4300 return -ENOMEM;
4300 } 4301 }
4301 4302
4302 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) { 4303 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4303 v = pci_alloc_consistent( 4304 v = pci_alloc_consistent(priv->pci_dev,
4304 priv->pci_dev, sizeof(struct ipw2100_data_header), &p); 4305 sizeof(struct ipw2100_data_header),
4306 &p);
4305 if (!v) { 4307 if (!v) {
4306 printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for tx " 4308 printk(KERN_ERR DRV_NAME
4307 "buffers.\n", priv->net_dev->name); 4309 ": %s: PCI alloc failed for tx " "buffers.\n",
4310 priv->net_dev->name);
4308 err = -ENOMEM; 4311 err = -ENOMEM;
4309 break; 4312 break;
4310 } 4313 }
4311 4314
4312 priv->tx_buffers[i].type = DATA; 4315 priv->tx_buffers[i].type = DATA;
4313 priv->tx_buffers[i].info.d_struct.data = (struct ipw2100_data_header*)v; 4316 priv->tx_buffers[i].info.d_struct.data =
4317 (struct ipw2100_data_header *)v;
4314 priv->tx_buffers[i].info.d_struct.data_phys = p; 4318 priv->tx_buffers[i].info.d_struct.data_phys = p;
4315 priv->tx_buffers[i].info.d_struct.txb = NULL; 4319 priv->tx_buffers[i].info.d_struct.txb = NULL;
4316 } 4320 }
@@ -4319,11 +4323,11 @@ static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4319 return 0; 4323 return 0;
4320 4324
4321 for (j = 0; j < i; j++) { 4325 for (j = 0; j < i; j++) {
4322 pci_free_consistent( 4326 pci_free_consistent(priv->pci_dev,
4323 priv->pci_dev, 4327 sizeof(struct ipw2100_data_header),
4324 sizeof(struct ipw2100_data_header), 4328 priv->tx_buffers[j].info.d_struct.data,
4325 priv->tx_buffers[j].info.d_struct.data, 4329 priv->tx_buffers[j].info.d_struct.
4326 priv->tx_buffers[j].info.d_struct.data_phys); 4330 data_phys);
4327 } 4331 }
4328 4332
4329 kfree(priv->tx_buffers); 4333 kfree(priv->tx_buffers);
@@ -4356,7 +4360,8 @@ static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4356 /* We simply drop any SKBs that have been queued for 4360 /* We simply drop any SKBs that have been queued for
4357 * transmit */ 4361 * transmit */
4358 if (priv->tx_buffers[i].info.d_struct.txb) { 4362 if (priv->tx_buffers[i].info.d_struct.txb) {
4359 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.txb); 4363 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4364 txb);
4360 priv->tx_buffers[i].info.d_struct.txb = NULL; 4365 priv->tx_buffers[i].info.d_struct.txb = NULL;
4361 } 4366 }
4362 4367
@@ -4394,15 +4399,17 @@ static void ipw2100_tx_free(struct ipw2100_priv *priv)
4394 4399
4395 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) { 4400 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4396 if (priv->tx_buffers[i].info.d_struct.txb) { 4401 if (priv->tx_buffers[i].info.d_struct.txb) {
4397 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.txb); 4402 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4403 txb);
4398 priv->tx_buffers[i].info.d_struct.txb = NULL; 4404 priv->tx_buffers[i].info.d_struct.txb = NULL;
4399 } 4405 }
4400 if (priv->tx_buffers[i].info.d_struct.data) 4406 if (priv->tx_buffers[i].info.d_struct.data)
4401 pci_free_consistent( 4407 pci_free_consistent(priv->pci_dev,
4402 priv->pci_dev, 4408 sizeof(struct ipw2100_data_header),
4403 sizeof(struct ipw2100_data_header), 4409 priv->tx_buffers[i].info.d_struct.
4404 priv->tx_buffers[i].info.d_struct.data, 4410 data,
4405 priv->tx_buffers[i].info.d_struct.data_phys); 4411 priv->tx_buffers[i].info.d_struct.
4412 data_phys);
4406 } 4413 }
4407 4414
4408 kfree(priv->tx_buffers); 4415 kfree(priv->tx_buffers);
@@ -4411,8 +4418,6 @@ static void ipw2100_tx_free(struct ipw2100_priv *priv)
4411 IPW_DEBUG_INFO("exit\n"); 4418 IPW_DEBUG_INFO("exit\n");
4412} 4419}
4413 4420
4414
4415
4416static int ipw2100_rx_allocate(struct ipw2100_priv *priv) 4421static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4417{ 4422{
4418 int i, j, err = -EINVAL; 4423 int i, j, err = -EINVAL;
@@ -4542,14 +4547,13 @@ static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4542 4547
4543 int err; 4548 int err;
4544 4549
4545 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, 4550 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, mac, &length);
4546 mac, &length);
4547 if (err) { 4551 if (err) {
4548 IPW_DEBUG_INFO("MAC address read failed\n"); 4552 IPW_DEBUG_INFO("MAC address read failed\n");
4549 return -EIO; 4553 return -EIO;
4550 } 4554 }
4551 IPW_DEBUG_INFO("card MAC is %02X:%02X:%02X:%02X:%02X:%02X\n", 4555 IPW_DEBUG_INFO("card MAC is %02X:%02X:%02X:%02X:%02X:%02X\n",
4552 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 4556 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
4553 4557
4554 memcpy(priv->net_dev->dev_addr, mac, ETH_ALEN); 4558 memcpy(priv->net_dev->dev_addr, mac, ETH_ALEN);
4555 4559
@@ -4576,8 +4580,7 @@ static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4576 IPW_DEBUG_INFO("enter\n"); 4580 IPW_DEBUG_INFO("enter\n");
4577 4581
4578 if (priv->config & CFG_CUSTOM_MAC) { 4582 if (priv->config & CFG_CUSTOM_MAC) {
4579 memcpy(cmd.host_command_parameters, priv->mac_addr, 4583 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4580 ETH_ALEN);
4581 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); 4584 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4582 } else 4585 } else
4583 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr, 4586 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
@@ -4614,7 +4617,8 @@ static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4614 if (!batch_mode) { 4617 if (!batch_mode) {
4615 err = ipw2100_disable_adapter(priv); 4618 err = ipw2100_disable_adapter(priv);
4616 if (err) { 4619 if (err) {
4617 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n", 4620 printk(KERN_ERR DRV_NAME
4621 ": %s: Could not disable adapter %d\n",
4618 priv->net_dev->name, err); 4622 priv->net_dev->name, err);
4619 return err; 4623 return err;
4620 } 4624 }
@@ -4629,7 +4633,6 @@ static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4629 return err; 4633 return err;
4630} 4634}
4631 4635
4632
4633static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel, 4636static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4634 int batch_mode) 4637 int batch_mode)
4635{ 4638{
@@ -4660,8 +4663,7 @@ static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4660 4663
4661 err = ipw2100_hw_send_command(priv, &cmd); 4664 err = ipw2100_hw_send_command(priv, &cmd);
4662 if (err) { 4665 if (err) {
4663 IPW_DEBUG_INFO("Failed to set channel to %d", 4666 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4664 channel);
4665 return err; 4667 return err;
4666 } 4668 }
4667 4669
@@ -4703,15 +4705,14 @@ static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4703 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START; 4705 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4704 4706
4705 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK | 4707 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4706 IPW_CFG_BSS_MASK | 4708 IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4707 IPW_CFG_802_1x_ENABLE;
4708 4709
4709 if (!(priv->config & CFG_LONG_PREAMBLE)) 4710 if (!(priv->config & CFG_LONG_PREAMBLE))
4710 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO; 4711 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4711 4712
4712 err = ipw2100_get_ordinal(priv, 4713 err = ipw2100_get_ordinal(priv,
4713 IPW_ORD_EEPROM_IBSS_11B_CHANNELS, 4714 IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4714 &ibss_mask, &len); 4715 &ibss_mask, &len);
4715 if (err) 4716 if (err)
4716 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK; 4717 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4717 4718
@@ -4719,7 +4720,7 @@ static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4719 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask; 4720 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4720 4721
4721 /* 11b only */ 4722 /* 11b only */
4722 /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A;*/ 4723 /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A; */
4723 4724
4724 err = ipw2100_hw_send_command(priv, &cmd); 4725 err = ipw2100_hw_send_command(priv, &cmd);
4725 if (err) 4726 if (err)
@@ -4783,8 +4784,7 @@ static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4783 return 0; 4784 return 0;
4784} 4785}
4785 4786
4786static int ipw2100_set_power_mode(struct ipw2100_priv *priv, 4787static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4787 int power_level)
4788{ 4788{
4789 struct host_command cmd = { 4789 struct host_command cmd = {
4790 .host_command = POWER_MODE, 4790 .host_command = POWER_MODE,
@@ -4805,11 +4805,10 @@ static int ipw2100_set_power_mode(struct ipw2100_priv *priv,
4805 priv->power_mode = IPW_POWER_ENABLED | power_level; 4805 priv->power_mode = IPW_POWER_ENABLED | power_level;
4806 4806
4807#ifdef CONFIG_IPW2100_TX_POWER 4807#ifdef CONFIG_IPW2100_TX_POWER
4808 if (priv->port_type == IBSS && 4808 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4809 priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4810 /* Set beacon interval */ 4809 /* Set beacon interval */
4811 cmd.host_command = TX_POWER_INDEX; 4810 cmd.host_command = TX_POWER_INDEX;
4812 cmd.host_command_parameters[0] = (u32)priv->adhoc_power; 4811 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4813 4812
4814 err = ipw2100_hw_send_command(priv, &cmd); 4813 err = ipw2100_hw_send_command(priv, &cmd);
4815 if (err) 4814 if (err)
@@ -4820,7 +4819,6 @@ static int ipw2100_set_power_mode(struct ipw2100_priv *priv,
4820 return 0; 4819 return 0;
4821} 4820}
4822 4821
4823
4824static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold) 4822static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4825{ 4823{
4826 struct host_command cmd = { 4824 struct host_command cmd = {
@@ -4925,8 +4923,7 @@ static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
4925 return 0; 4923 return 0;
4926} 4924}
4927 4925
4928 4926static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
4929static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 *bssid,
4930 int batch_mode) 4927 int batch_mode)
4931{ 4928{
4932 struct host_command cmd = { 4929 struct host_command cmd = {
@@ -4938,16 +4935,15 @@ static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 *bssid,
4938 4935
4939#ifdef CONFIG_IPW_DEBUG 4936#ifdef CONFIG_IPW_DEBUG
4940 if (bssid != NULL) 4937 if (bssid != NULL)
4941 IPW_DEBUG_HC( 4938 IPW_DEBUG_HC("MANDATORY_BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n",
4942 "MANDATORY_BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", 4939 bssid[0], bssid[1], bssid[2], bssid[3], bssid[4],
4943 bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], 4940 bssid[5]);
4944 bssid[5]);
4945 else 4941 else
4946 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n"); 4942 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
4947#endif 4943#endif
4948 /* if BSSID is empty then we disable mandatory bssid mode */ 4944 /* if BSSID is empty then we disable mandatory bssid mode */
4949 if (bssid != NULL) 4945 if (bssid != NULL)
4950 memcpy((u8 *)cmd.host_command_parameters, bssid, ETH_ALEN); 4946 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
4951 4947
4952 if (!batch_mode) { 4948 if (!batch_mode) {
4953 err = ipw2100_disable_adapter(priv); 4949 err = ipw2100_disable_adapter(priv);
@@ -4963,7 +4959,6 @@ static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 *bssid,
4963 return err; 4959 return err;
4964} 4960}
4965 4961
4966#ifdef CONFIG_IEEE80211_WPA
4967static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv) 4962static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
4968{ 4963{
4969 struct host_command cmd = { 4964 struct host_command cmd = {
@@ -4987,42 +4982,10 @@ static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
4987 4982
4988 return err; 4983 return err;
4989} 4984}
4990#endif
4991
4992/*
4993 * Pseudo code for setting up wpa_frame:
4994 */
4995#if 0
4996void x(struct ieee80211_assoc_frame *wpa_assoc)
4997{
4998 struct ipw2100_wpa_assoc_frame frame;
4999 frame->fixed_ie_mask = IPW_WPA_CAPABILTIES |
5000 IPW_WPA_LISTENINTERVAL |
5001 IPW_WPA_AP_ADDRESS;
5002 frame->capab_info = wpa_assoc->capab_info;
5003 frame->lisen_interval = wpa_assoc->listent_interval;
5004 memcpy(frame->current_ap, wpa_assoc->current_ap, ETH_ALEN);
5005
5006 /* UNKNOWN -- I'm not postivive about this part; don't have any WPA
5007 * setup here to test it with.
5008 *
5009 * Walk the IEs in the wpa_assoc and figure out the total size of all
5010 * that data. Stick that into frame->var_ie_len. Then memcpy() all of
5011 * the IEs from wpa_frame into frame.
5012 */
5013 frame->var_ie_len = calculate_ie_len(wpa_assoc);
5014 memcpy(frame->var_ie, wpa_assoc->variable, frame->var_ie_len);
5015
5016 ipw2100_set_wpa_ie(priv, &frame, 0);
5017}
5018#endif
5019
5020
5021
5022 4985
5023static int ipw2100_set_wpa_ie(struct ipw2100_priv *, 4986static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
5024 struct ipw2100_wpa_assoc_frame *, int) 4987 struct ipw2100_wpa_assoc_frame *, int)
5025__attribute__ ((unused)); 4988 __attribute__ ((unused));
5026 4989
5027static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv, 4990static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
5028 struct ipw2100_wpa_assoc_frame *wpa_frame, 4991 struct ipw2100_wpa_assoc_frame *wpa_frame,
@@ -5076,7 +5039,7 @@ static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5076 .host_command_length = sizeof(struct security_info_params) 5039 .host_command_length = sizeof(struct security_info_params)
5077 }; 5040 };
5078 struct security_info_params *security = 5041 struct security_info_params *security =
5079 (struct security_info_params *)&cmd.host_command_parameters; 5042 (struct security_info_params *)&cmd.host_command_parameters;
5080 int err; 5043 int err;
5081 memset(security, 0, sizeof(*security)); 5044 memset(security, 0, sizeof(*security));
5082 5045
@@ -5094,25 +5057,25 @@ static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5094 break; 5057 break;
5095 case SEC_LEVEL_1: 5058 case SEC_LEVEL_1:
5096 security->allowed_ciphers = IPW_WEP40_CIPHER | 5059 security->allowed_ciphers = IPW_WEP40_CIPHER |
5097 IPW_WEP104_CIPHER; 5060 IPW_WEP104_CIPHER;
5098 break; 5061 break;
5099 case SEC_LEVEL_2: 5062 case SEC_LEVEL_2:
5100 security->allowed_ciphers = IPW_WEP40_CIPHER | 5063 security->allowed_ciphers = IPW_WEP40_CIPHER |
5101 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER; 5064 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5102 break; 5065 break;
5103 case SEC_LEVEL_2_CKIP: 5066 case SEC_LEVEL_2_CKIP:
5104 security->allowed_ciphers = IPW_WEP40_CIPHER | 5067 security->allowed_ciphers = IPW_WEP40_CIPHER |
5105 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER; 5068 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5106 break; 5069 break;
5107 case SEC_LEVEL_3: 5070 case SEC_LEVEL_3:
5108 security->allowed_ciphers = IPW_WEP40_CIPHER | 5071 security->allowed_ciphers = IPW_WEP40_CIPHER |
5109 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER; 5072 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5110 break; 5073 break;
5111 } 5074 }
5112 5075
5113 IPW_DEBUG_HC( 5076 IPW_DEBUG_HC
5114 "SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n", 5077 ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5115 security->auth_mode, security->allowed_ciphers, security_level); 5078 security->auth_mode, security->allowed_ciphers, security_level);
5116 5079
5117 security->replay_counters_number = 0; 5080 security->replay_counters_number = 0;
5118 5081
@@ -5130,8 +5093,7 @@ static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5130 return err; 5093 return err;
5131} 5094}
5132 5095
5133static int ipw2100_set_tx_power(struct ipw2100_priv *priv, 5096static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5134 u32 tx_power)
5135{ 5097{
5136 struct host_command cmd = { 5098 struct host_command cmd = {
5137 .host_command = TX_POWER_INDEX, 5099 .host_command = TX_POWER_INDEX,
@@ -5140,6 +5102,10 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv,
5140 }; 5102 };
5141 int err = 0; 5103 int err = 0;
5142 5104
5105 if (tx_power != IPW_TX_POWER_DEFAULT)
5106 tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5107 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5108
5143 cmd.host_command_parameters[0] = tx_power; 5109 cmd.host_command_parameters[0] = tx_power;
5144 5110
5145 if (priv->ieee->iw_mode == IW_MODE_ADHOC) 5111 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
@@ -5185,7 +5151,6 @@ static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5185 return 0; 5151 return 0;
5186} 5152}
5187 5153
5188
5189void ipw2100_queues_initialize(struct ipw2100_priv *priv) 5154void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5190{ 5155{
5191 ipw2100_tx_initialize(priv); 5156 ipw2100_tx_initialize(priv);
@@ -5203,13 +5168,12 @@ void ipw2100_queues_free(struct ipw2100_priv *priv)
5203int ipw2100_queues_allocate(struct ipw2100_priv *priv) 5168int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5204{ 5169{
5205 if (ipw2100_tx_allocate(priv) || 5170 if (ipw2100_tx_allocate(priv) ||
5206 ipw2100_rx_allocate(priv) || 5171 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5207 ipw2100_msg_allocate(priv))
5208 goto fail; 5172 goto fail;
5209 5173
5210 return 0; 5174 return 0;
5211 5175
5212 fail: 5176 fail:
5213 ipw2100_tx_free(priv); 5177 ipw2100_tx_free(priv);
5214 ipw2100_rx_free(priv); 5178 ipw2100_rx_free(priv);
5215 ipw2100_msg_free(priv); 5179 ipw2100_msg_free(priv);
@@ -5235,7 +5199,8 @@ static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5235 if (!batch_mode) { 5199 if (!batch_mode) {
5236 err = ipw2100_disable_adapter(priv); 5200 err = ipw2100_disable_adapter(priv);
5237 if (err) { 5201 if (err) {
5238 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n", 5202 printk(KERN_ERR DRV_NAME
5203 ": %s: Could not disable adapter %d\n",
5239 priv->net_dev->name, err); 5204 priv->net_dev->name, err);
5240 return err; 5205 return err;
5241 } 5206 }
@@ -5262,7 +5227,6 @@ struct ipw2100_wep_key {
5262#define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4] 5227#define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5263#define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10] 5228#define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
5264 5229
5265
5266/** 5230/**
5267 * Set a the wep key 5231 * Set a the wep key
5268 * 5232 *
@@ -5287,11 +5251,11 @@ static int ipw2100_set_key(struct ipw2100_priv *priv,
5287 .host_command_sequence = 0, 5251 .host_command_sequence = 0,
5288 .host_command_length = sizeof(struct ipw2100_wep_key), 5252 .host_command_length = sizeof(struct ipw2100_wep_key),
5289 }; 5253 };
5290 struct ipw2100_wep_key *wep_key = (void*)cmd.host_command_parameters; 5254 struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5291 int err; 5255 int err;
5292 5256
5293 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n", 5257 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5294 idx, keylen, len); 5258 idx, keylen, len);
5295 5259
5296 /* NOTE: We don't check cached values in case the firmware was reset 5260 /* NOTE: We don't check cached values in case the firmware was reset
5297 * or some other problem is occuring. If the user is setting the key, 5261 * or some other problem is occuring. If the user is setting the key,
@@ -5308,22 +5272,23 @@ static int ipw2100_set_key(struct ipw2100_priv *priv,
5308 /* Will be optimized out on debug not being configured in */ 5272 /* Will be optimized out on debug not being configured in */
5309 if (keylen == 0) 5273 if (keylen == 0)
5310 IPW_DEBUG_WEP("%s: Clearing key %d\n", 5274 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5311 priv->net_dev->name, wep_key->idx); 5275 priv->net_dev->name, wep_key->idx);
5312 else if (keylen == 5) 5276 else if (keylen == 5)
5313 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n", 5277 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5314 priv->net_dev->name, wep_key->idx, wep_key->len, 5278 priv->net_dev->name, wep_key->idx, wep_key->len,
5315 WEP_STR_64(wep_key->key)); 5279 WEP_STR_64(wep_key->key));
5316 else 5280 else
5317 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128 5281 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5318 "\n", 5282 "\n",
5319 priv->net_dev->name, wep_key->idx, wep_key->len, 5283 priv->net_dev->name, wep_key->idx, wep_key->len,
5320 WEP_STR_128(wep_key->key)); 5284 WEP_STR_128(wep_key->key));
5321 5285
5322 if (!batch_mode) { 5286 if (!batch_mode) {
5323 err = ipw2100_disable_adapter(priv); 5287 err = ipw2100_disable_adapter(priv);
5324 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */ 5288 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */
5325 if (err) { 5289 if (err) {
5326 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n", 5290 printk(KERN_ERR DRV_NAME
5291 ": %s: Could not disable adapter %d\n",
5327 priv->net_dev->name, err); 5292 priv->net_dev->name, err);
5328 return err; 5293 return err;
5329 } 5294 }
@@ -5347,7 +5312,7 @@ static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5347 .host_command = WEP_KEY_INDEX, 5312 .host_command = WEP_KEY_INDEX,
5348 .host_command_sequence = 0, 5313 .host_command_sequence = 0,
5349 .host_command_length = 4, 5314 .host_command_length = 4,
5350 .host_command_parameters = { idx }, 5315 .host_command_parameters = {idx},
5351 }; 5316 };
5352 int err; 5317 int err;
5353 5318
@@ -5359,7 +5324,8 @@ static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5359 if (!batch_mode) { 5324 if (!batch_mode) {
5360 err = ipw2100_disable_adapter(priv); 5325 err = ipw2100_disable_adapter(priv);
5361 if (err) { 5326 if (err) {
5362 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n", 5327 printk(KERN_ERR DRV_NAME
5328 ": %s: Could not disable adapter %d\n",
5363 priv->net_dev->name, err); 5329 priv->net_dev->name, err);
5364 return err; 5330 return err;
5365 } 5331 }
@@ -5374,9 +5340,7 @@ static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5374 return err; 5340 return err;
5375} 5341}
5376 5342
5377 5343static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5378static int ipw2100_configure_security(struct ipw2100_priv *priv,
5379 int batch_mode)
5380{ 5344{
5381 int i, err, auth_mode, sec_level, use_group; 5345 int i, err, auth_mode, sec_level, use_group;
5382 5346
@@ -5389,40 +5353,42 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv,
5389 return err; 5353 return err;
5390 } 5354 }
5391 5355
5392 if (!priv->sec.enabled) { 5356 if (!priv->ieee->sec.enabled) {
5393 err = ipw2100_set_security_information( 5357 err =
5394 priv, IPW_AUTH_OPEN, SEC_LEVEL_0, 0, 1); 5358 ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5359 SEC_LEVEL_0, 0, 1);
5395 } else { 5360 } else {
5396 auth_mode = IPW_AUTH_OPEN; 5361 auth_mode = IPW_AUTH_OPEN;
5397 if ((priv->sec.flags & SEC_AUTH_MODE) && 5362 if ((priv->ieee->sec.flags & SEC_AUTH_MODE) &&
5398 (priv->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) 5363 (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY))
5399 auth_mode = IPW_AUTH_SHARED; 5364 auth_mode = IPW_AUTH_SHARED;
5400 5365
5401 sec_level = SEC_LEVEL_0; 5366 sec_level = SEC_LEVEL_0;
5402 if (priv->sec.flags & SEC_LEVEL) 5367 if (priv->ieee->sec.flags & SEC_LEVEL)
5403 sec_level = priv->sec.level; 5368 sec_level = priv->ieee->sec.level;
5404 5369
5405 use_group = 0; 5370 use_group = 0;
5406 if (priv->sec.flags & SEC_UNICAST_GROUP) 5371 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5407 use_group = priv->sec.unicast_uses_group; 5372 use_group = priv->ieee->sec.unicast_uses_group;
5408 5373
5409 err = ipw2100_set_security_information( 5374 err =
5410 priv, auth_mode, sec_level, use_group, 1); 5375 ipw2100_set_security_information(priv, auth_mode, sec_level,
5376 use_group, 1);
5411 } 5377 }
5412 5378
5413 if (err) 5379 if (err)
5414 goto exit; 5380 goto exit;
5415 5381
5416 if (priv->sec.enabled) { 5382 if (priv->ieee->sec.enabled) {
5417 for (i = 0; i < 4; i++) { 5383 for (i = 0; i < 4; i++) {
5418 if (!(priv->sec.flags & (1 << i))) { 5384 if (!(priv->ieee->sec.flags & (1 << i))) {
5419 memset(priv->sec.keys[i], 0, WEP_KEY_LEN); 5385 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5420 priv->sec.key_sizes[i] = 0; 5386 priv->ieee->sec.key_sizes[i] = 0;
5421 } else { 5387 } else {
5422 err = ipw2100_set_key(priv, i, 5388 err = ipw2100_set_key(priv, i,
5423 priv->sec.keys[i], 5389 priv->ieee->sec.keys[i],
5424 priv->sec.key_sizes[i], 5390 priv->ieee->sec.
5425 1); 5391 key_sizes[i], 1);
5426 if (err) 5392 if (err)
5427 goto exit; 5393 goto exit;
5428 } 5394 }
@@ -5433,14 +5399,16 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv,
5433 5399
5434 /* Always enable privacy so the Host can filter WEP packets if 5400 /* Always enable privacy so the Host can filter WEP packets if
5435 * encrypted data is sent up */ 5401 * encrypted data is sent up */
5436 err = ipw2100_set_wep_flags( 5402 err =
5437 priv, priv->sec.enabled ? IPW_PRIVACY_CAPABLE : 0, 1); 5403 ipw2100_set_wep_flags(priv,
5404 priv->ieee->sec.
5405 enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5438 if (err) 5406 if (err)
5439 goto exit; 5407 goto exit;
5440 5408
5441 priv->status &= ~STATUS_SECURITY_UPDATED; 5409 priv->status &= ~STATUS_SECURITY_UPDATED;
5442 5410
5443 exit: 5411 exit:
5444 if (!batch_mode) 5412 if (!batch_mode)
5445 ipw2100_enable_adapter(priv); 5413 ipw2100_enable_adapter(priv);
5446 5414
@@ -5469,60 +5437,64 @@ static void shim__set_security(struct net_device *dev,
5469 5437
5470 for (i = 0; i < 4; i++) { 5438 for (i = 0; i < 4; i++) {
5471 if (sec->flags & (1 << i)) { 5439 if (sec->flags & (1 << i)) {
5472 priv->sec.key_sizes[i] = sec->key_sizes[i]; 5440 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5473 if (sec->key_sizes[i] == 0) 5441 if (sec->key_sizes[i] == 0)
5474 priv->sec.flags &= ~(1 << i); 5442 priv->ieee->sec.flags &= ~(1 << i);
5475 else 5443 else
5476 memcpy(priv->sec.keys[i], sec->keys[i], 5444 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5477 sec->key_sizes[i]); 5445 sec->key_sizes[i]);
5478 priv->sec.flags |= (1 << i); 5446 if (sec->level == SEC_LEVEL_1) {
5479 priv->status |= STATUS_SECURITY_UPDATED; 5447 priv->ieee->sec.flags |= (1 << i);
5448 priv->status |= STATUS_SECURITY_UPDATED;
5449 } else
5450 priv->ieee->sec.flags &= ~(1 << i);
5480 } 5451 }
5481 } 5452 }
5482 5453
5483 if ((sec->flags & SEC_ACTIVE_KEY) && 5454 if ((sec->flags & SEC_ACTIVE_KEY) &&
5484 priv->sec.active_key != sec->active_key) { 5455 priv->ieee->sec.active_key != sec->active_key) {
5485 if (sec->active_key <= 3) { 5456 if (sec->active_key <= 3) {
5486 priv->sec.active_key = sec->active_key; 5457 priv->ieee->sec.active_key = sec->active_key;
5487 priv->sec.flags |= SEC_ACTIVE_KEY; 5458 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5488 } else 5459 } else
5489 priv->sec.flags &= ~SEC_ACTIVE_KEY; 5460 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
5490 5461
5491 priv->status |= STATUS_SECURITY_UPDATED; 5462 priv->status |= STATUS_SECURITY_UPDATED;
5492 } 5463 }
5493 5464
5494 if ((sec->flags & SEC_AUTH_MODE) && 5465 if ((sec->flags & SEC_AUTH_MODE) &&
5495 (priv->sec.auth_mode != sec->auth_mode)) { 5466 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5496 priv->sec.auth_mode = sec->auth_mode; 5467 priv->ieee->sec.auth_mode = sec->auth_mode;
5497 priv->sec.flags |= SEC_AUTH_MODE; 5468 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5498 priv->status |= STATUS_SECURITY_UPDATED; 5469 priv->status |= STATUS_SECURITY_UPDATED;
5499 } 5470 }
5500 5471
5501 if (sec->flags & SEC_ENABLED && 5472 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5502 priv->sec.enabled != sec->enabled) { 5473 priv->ieee->sec.flags |= SEC_ENABLED;
5503 priv->sec.flags |= SEC_ENABLED; 5474 priv->ieee->sec.enabled = sec->enabled;
5504 priv->sec.enabled = sec->enabled;
5505 priv->status |= STATUS_SECURITY_UPDATED; 5475 priv->status |= STATUS_SECURITY_UPDATED;
5506 force_update = 1; 5476 force_update = 1;
5507 } 5477 }
5508 5478
5509 if (sec->flags & SEC_LEVEL && 5479 if (sec->flags & SEC_ENCRYPT)
5510 priv->sec.level != sec->level) { 5480 priv->ieee->sec.encrypt = sec->encrypt;
5511 priv->sec.level = sec->level; 5481
5512 priv->sec.flags |= SEC_LEVEL; 5482 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5483 priv->ieee->sec.level = sec->level;
5484 priv->ieee->sec.flags |= SEC_LEVEL;
5513 priv->status |= STATUS_SECURITY_UPDATED; 5485 priv->status |= STATUS_SECURITY_UPDATED;
5514 } 5486 }
5515 5487
5516 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n", 5488 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5517 priv->sec.flags & (1<<8) ? '1' : '0', 5489 priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5518 priv->sec.flags & (1<<7) ? '1' : '0', 5490 priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5519 priv->sec.flags & (1<<6) ? '1' : '0', 5491 priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5520 priv->sec.flags & (1<<5) ? '1' : '0', 5492 priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5521 priv->sec.flags & (1<<4) ? '1' : '0', 5493 priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5522 priv->sec.flags & (1<<3) ? '1' : '0', 5494 priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5523 priv->sec.flags & (1<<2) ? '1' : '0', 5495 priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5524 priv->sec.flags & (1<<1) ? '1' : '0', 5496 priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5525 priv->sec.flags & (1<<0) ? '1' : '0'); 5497 priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5526 5498
5527/* As a temporary work around to enable WPA until we figure out why 5499/* As a temporary work around to enable WPA until we figure out why
5528 * wpa_supplicant toggles the security capability of the driver, which 5500 * wpa_supplicant toggles the security capability of the driver, which
@@ -5531,7 +5503,7 @@ static void shim__set_security(struct net_device *dev,
5531 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/ 5503 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/
5532 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) 5504 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5533 ipw2100_configure_security(priv, 0); 5505 ipw2100_configure_security(priv, 0);
5534done: 5506 done:
5535 up(&priv->action_sem); 5507 up(&priv->action_sem);
5536} 5508}
5537 5509
@@ -5556,7 +5528,7 @@ static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5556 5528
5557 return 0; 5529 return 0;
5558 } 5530 }
5559#endif /* CONFIG_IPW2100_MONITOR */ 5531#endif /* CONFIG_IPW2100_MONITOR */
5560 5532
5561 err = ipw2100_read_mac_address(priv); 5533 err = ipw2100_read_mac_address(priv);
5562 if (err) 5534 if (err)
@@ -5576,7 +5548,7 @@ static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5576 return err; 5548 return err;
5577 } 5549 }
5578 5550
5579 err = ipw2100_system_config(priv, batch_mode); 5551 err = ipw2100_system_config(priv, batch_mode);
5580 if (err) 5552 if (err)
5581 return err; 5553 return err;
5582 5554
@@ -5614,8 +5586,10 @@ static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5614 return err; 5586 return err;
5615 5587
5616 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { 5588 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5617 err = ipw2100_set_ibss_beacon_interval( 5589 err =
5618 priv, priv->beacon_interval, batch_mode); 5590 ipw2100_set_ibss_beacon_interval(priv,
5591 priv->beacon_interval,
5592 batch_mode);
5619 if (err) 5593 if (err)
5620 return err; 5594 return err;
5621 5595
@@ -5625,18 +5599,17 @@ static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5625 } 5599 }
5626 5600
5627 /* 5601 /*
5628 err = ipw2100_set_fragmentation_threshold( 5602 err = ipw2100_set_fragmentation_threshold(
5629 priv, priv->frag_threshold, batch_mode); 5603 priv, priv->frag_threshold, batch_mode);
5630 if (err) 5604 if (err)
5631 return err; 5605 return err;
5632 */ 5606 */
5633 5607
5634 IPW_DEBUG_INFO("exit\n"); 5608 IPW_DEBUG_INFO("exit\n");
5635 5609
5636 return 0; 5610 return 0;
5637} 5611}
5638 5612
5639
5640/************************************************************************* 5613/*************************************************************************
5641 * 5614 *
5642 * EXTERNALLY CALLED METHODS 5615 * EXTERNALLY CALLED METHODS
@@ -5669,7 +5642,7 @@ static int ipw2100_set_address(struct net_device *dev, void *p)
5669 ipw2100_reset_adapter(priv); 5642 ipw2100_reset_adapter(priv);
5670 return 0; 5643 return 0;
5671 5644
5672 done: 5645 done:
5673 up(&priv->action_sem); 5646 up(&priv->action_sem);
5674 return err; 5647 return err;
5675} 5648}
@@ -5708,7 +5681,7 @@ static int ipw2100_close(struct net_device *dev)
5708 /* Flush the TX queue ... */ 5681 /* Flush the TX queue ... */
5709 while (!list_empty(&priv->tx_pend_list)) { 5682 while (!list_empty(&priv->tx_pend_list)) {
5710 element = priv->tx_pend_list.next; 5683 element = priv->tx_pend_list.next;
5711 packet = list_entry(element, struct ipw2100_tx_packet, list); 5684 packet = list_entry(element, struct ipw2100_tx_packet, list);
5712 5685
5713 list_del(element); 5686 list_del(element);
5714 DEC_STAT(&priv->tx_pend_stat); 5687 DEC_STAT(&priv->tx_pend_stat);
@@ -5726,8 +5699,6 @@ static int ipw2100_close(struct net_device *dev)
5726 return 0; 5699 return 0;
5727} 5700}
5728 5701
5729
5730
5731/* 5702/*
5732 * TODO: Fix this function... its just wrong 5703 * TODO: Fix this function... its just wrong
5733 */ 5704 */
@@ -5747,7 +5718,6 @@ static void ipw2100_tx_timeout(struct net_device *dev)
5747 schedule_reset(priv); 5718 schedule_reset(priv);
5748} 5719}
5749 5720
5750
5751/* 5721/*
5752 * TODO: reimplement it so that it reads statistics 5722 * TODO: reimplement it so that it reads statistics
5753 * from the adapter using ordinal tables 5723 * from the adapter using ordinal tables
@@ -5761,11 +5731,10 @@ static struct net_device_stats *ipw2100_stats(struct net_device *dev)
5761 return &priv->ieee->stats; 5731 return &priv->ieee->stats;
5762} 5732}
5763 5733
5764/* Support for wpa_supplicant. Will be replaced with WEXT once 5734#if WIRELESS_EXT < 18
5765 * they get WPA support. */ 5735/* Support for wpa_supplicant before WE-18, deprecated. */
5766#ifdef CONFIG_IEEE80211_WPA
5767 5736
5768/* following definitions must match definitions in driver_ipw2100.c */ 5737/* following definitions must match definitions in driver_ipw.c */
5769 5738
5770#define IPW2100_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30 5739#define IPW2100_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
5771 5740
@@ -5796,25 +5765,26 @@ static struct net_device_stats *ipw2100_stats(struct net_device *dev)
5796struct ipw2100_param { 5765struct ipw2100_param {
5797 u32 cmd; 5766 u32 cmd;
5798 u8 sta_addr[ETH_ALEN]; 5767 u8 sta_addr[ETH_ALEN];
5799 union { 5768 union {
5800 struct { 5769 struct {
5801 u8 name; 5770 u8 name;
5802 u32 value; 5771 u32 value;
5803 } wpa_param; 5772 } wpa_param;
5804 struct { 5773 struct {
5805 u32 len; 5774 u32 len;
5806 u8 *data; 5775 u8 reserved[32];
5776 u8 data[0];
5807 } wpa_ie; 5777 } wpa_ie;
5808 struct{ 5778 struct {
5809 int command; 5779 u32 command;
5810 int reason_code; 5780 u32 reason_code;
5811 } mlme; 5781 } mlme;
5812 struct { 5782 struct {
5813 u8 alg[IPW2100_CRYPT_ALG_NAME_LEN]; 5783 u8 alg[IPW2100_CRYPT_ALG_NAME_LEN];
5814 u8 set_tx; 5784 u8 set_tx;
5815 u32 err; 5785 u32 err;
5816 u8 idx; 5786 u8 idx;
5817 u8 seq[8]; /* sequence counter (set: RX, get: TX) */ 5787 u8 seq[8]; /* sequence counter (set: RX, get: TX) */
5818 u16 key_len; 5788 u16 key_len;
5819 u8 key[0]; 5789 u8 key[0];
5820 } crypt; 5790 } crypt;
@@ -5822,38 +5792,24 @@ struct ipw2100_param {
5822 } u; 5792 } u;
5823}; 5793};
5824 5794
5825/* end of driver_ipw2100.c code */ 5795/* end of driver_ipw.c code */
5796#endif /* WIRELESS_EXT < 18 */
5826 5797
5827static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value){ 5798static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5828 5799{
5829 struct ieee80211_device *ieee = priv->ieee; 5800 /* This is called when wpa_supplicant loads and closes the driver
5830 struct ieee80211_security sec = { 5801 * interface. */
5831 .flags = SEC_LEVEL | SEC_ENABLED, 5802 priv->ieee->wpa_enabled = value;
5832 }; 5803 return 0;
5833 int ret = 0;
5834
5835 ieee->wpa_enabled = value;
5836
5837 if (value){
5838 sec.level = SEC_LEVEL_3;
5839 sec.enabled = 1;
5840 } else {
5841 sec.level = SEC_LEVEL_0;
5842 sec.enabled = 0;
5843 }
5844
5845 if (ieee->set_security)
5846 ieee->set_security(ieee->dev, &sec);
5847 else
5848 ret = -EOPNOTSUPP;
5849
5850 return ret;
5851} 5804}
5852 5805
5853#define AUTH_ALG_OPEN_SYSTEM 0x1 5806#if WIRELESS_EXT < 18
5854#define AUTH_ALG_SHARED_KEY 0x2 5807#define IW_AUTH_ALG_OPEN_SYSTEM 0x1
5808#define IW_AUTH_ALG_SHARED_KEY 0x2
5809#endif
5855 5810
5856static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value){ 5811static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5812{
5857 5813
5858 struct ieee80211_device *ieee = priv->ieee; 5814 struct ieee80211_device *ieee = priv->ieee;
5859 struct ieee80211_security sec = { 5815 struct ieee80211_security sec = {
@@ -5861,13 +5817,14 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value){
5861 }; 5817 };
5862 int ret = 0; 5818 int ret = 0;
5863 5819
5864 if (value & AUTH_ALG_SHARED_KEY){ 5820 if (value & IW_AUTH_ALG_SHARED_KEY) {
5865 sec.auth_mode = WLAN_AUTH_SHARED_KEY; 5821 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5866 ieee->open_wep = 0; 5822 ieee->open_wep = 0;
5867 } else { 5823 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5868 sec.auth_mode = WLAN_AUTH_OPEN; 5824 sec.auth_mode = WLAN_AUTH_OPEN;
5869 ieee->open_wep = 1; 5825 ieee->open_wep = 1;
5870 } 5826 } else
5827 return -EINVAL;
5871 5828
5872 if (ieee->set_security) 5829 if (ieee->set_security)
5873 ieee->set_security(ieee->dev, &sec); 5830 ieee->set_security(ieee->dev, &sec);
@@ -5877,103 +5834,135 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value){
5877 return ret; 5834 return ret;
5878} 5835}
5879 5836
5837void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5838 char *wpa_ie, int wpa_ie_len)
5839{
5880 5840
5881static int ipw2100_wpa_set_param(struct net_device *dev, u8 name, u32 value){ 5841 struct ipw2100_wpa_assoc_frame frame;
5882
5883 struct ipw2100_priv *priv = ieee80211_priv(dev);
5884 int ret=0;
5885 5842
5886 switch(name){ 5843 frame.fixed_ie_mask = 0;
5887 case IPW2100_PARAM_WPA_ENABLED:
5888 ret = ipw2100_wpa_enable(priv, value);
5889 break;
5890 5844
5891 case IPW2100_PARAM_TKIP_COUNTERMEASURES: 5845 /* copy WPA IE */
5892 priv->ieee->tkip_countermeasures=value; 5846 memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5893 break; 5847 frame.var_ie_len = wpa_ie_len;
5894 5848
5895 case IPW2100_PARAM_DROP_UNENCRYPTED: 5849 /* make sure WPA is enabled */
5896 priv->ieee->drop_unencrypted=value; 5850 ipw2100_wpa_enable(priv, 1);
5897 break; 5851 ipw2100_set_wpa_ie(priv, &frame, 0);
5852}
5898 5853
5899 case IPW2100_PARAM_PRIVACY_INVOKED: 5854#if WIRELESS_EXT < 18
5900 priv->ieee->privacy_invoked=value; 5855static int ipw2100_wpa_set_param(struct net_device *dev, u8 name, u32 value)
5901 break; 5856{
5857 struct ipw2100_priv *priv = ieee80211_priv(dev);
5858 struct ieee80211_crypt_data *crypt;
5859 unsigned long flags;
5860 int ret = 0;
5902 5861
5903 case IPW2100_PARAM_AUTH_ALGS: 5862 switch (name) {
5904 ret = ipw2100_wpa_set_auth_algs(priv, value); 5863 case IPW2100_PARAM_WPA_ENABLED:
5905 break; 5864 ret = ipw2100_wpa_enable(priv, value);
5865 break;
5906 5866
5907 case IPW2100_PARAM_IEEE_802_1X: 5867 case IPW2100_PARAM_TKIP_COUNTERMEASURES:
5908 priv->ieee->ieee802_1x=value; 5868 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
5869 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
5909 break; 5870 break;
5910 5871
5911 default: 5872 flags = crypt->ops->get_flags(crypt->priv);
5912 printk(KERN_ERR DRV_NAME ": %s: Unknown WPA param: %d\n",
5913 dev->name, name);
5914 ret = -EOPNOTSUPP;
5915 }
5916 5873
5917 return ret; 5874 if (value)
5918} 5875 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
5876 else
5877 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
5919 5878
5920static int ipw2100_wpa_mlme(struct net_device *dev, int command, int reason){ 5879 crypt->ops->set_flags(flags, crypt->priv);
5921 5880
5922 struct ipw2100_priv *priv = ieee80211_priv(dev); 5881 break;
5923 int ret=0;
5924 5882
5925 switch(command){ 5883 case IPW2100_PARAM_DROP_UNENCRYPTED:{
5926 case IPW2100_MLME_STA_DEAUTH: 5884 /* See IW_AUTH_DROP_UNENCRYPTED handling for details */
5927 // silently ignore 5885 struct ieee80211_security sec = {
5886 .flags = SEC_ENABLED,
5887 .enabled = value,
5888 };
5889 priv->ieee->drop_unencrypted = value;
5890 /* We only change SEC_LEVEL for open mode. Others
5891 * are set by ipw_wpa_set_encryption.
5892 */
5893 if (!value) {
5894 sec.flags |= SEC_LEVEL;
5895 sec.level = SEC_LEVEL_0;
5896 } else {
5897 sec.flags |= SEC_LEVEL;
5898 sec.level = SEC_LEVEL_1;
5899 }
5900 if (priv->ieee->set_security)
5901 priv->ieee->set_security(priv->ieee->dev, &sec);
5928 break; 5902 break;
5903 }
5929 5904
5930 case IPW2100_MLME_STA_DISASSOC: 5905 case IPW2100_PARAM_PRIVACY_INVOKED:
5931 ipw2100_disassociate_bssid(priv); 5906 priv->ieee->privacy_invoked = value;
5932 break; 5907 break;
5933 5908
5934 default: 5909 case IPW2100_PARAM_AUTH_ALGS:
5935 printk(KERN_ERR DRV_NAME ": %s: Unknown MLME request: %d\n", 5910 ret = ipw2100_wpa_set_auth_algs(priv, value);
5936 dev->name, command); 5911 break;
5937 ret = -EOPNOTSUPP; 5912
5913 case IPW2100_PARAM_IEEE_802_1X:
5914 priv->ieee->ieee802_1x = value;
5915 break;
5916
5917 default:
5918 printk(KERN_ERR DRV_NAME ": %s: Unknown WPA param: %d\n",
5919 dev->name, name);
5920 ret = -EOPNOTSUPP;
5938 } 5921 }
5939 5922
5940 return ret; 5923 return ret;
5941} 5924}
5942 5925
5926static int ipw2100_wpa_mlme(struct net_device *dev, int command, int reason)
5927{
5943 5928
5944void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, 5929 struct ipw2100_priv *priv = ieee80211_priv(dev);
5945 char *wpa_ie, int wpa_ie_len){ 5930 int ret = 0;
5946 5931
5947 struct ipw2100_wpa_assoc_frame frame; 5932 switch (command) {
5933 case IPW2100_MLME_STA_DEAUTH:
5934 // silently ignore
5935 break;
5948 5936
5949 frame.fixed_ie_mask = 0; 5937 case IPW2100_MLME_STA_DISASSOC:
5938 ipw2100_disassociate_bssid(priv);
5939 break;
5950 5940
5951 /* copy WPA IE */ 5941 default:
5952 memcpy(frame.var_ie, wpa_ie, wpa_ie_len); 5942 printk(KERN_ERR DRV_NAME ": %s: Unknown MLME request: %d\n",
5953 frame.var_ie_len = wpa_ie_len; 5943 dev->name, command);
5944 ret = -EOPNOTSUPP;
5945 }
5954 5946
5955 /* make sure WPA is enabled */ 5947 return ret;
5956 ipw2100_wpa_enable(priv, 1);
5957 ipw2100_set_wpa_ie(priv, &frame, 0);
5958} 5948}
5959 5949
5960
5961static int ipw2100_wpa_set_wpa_ie(struct net_device *dev, 5950static int ipw2100_wpa_set_wpa_ie(struct net_device *dev,
5962 struct ipw2100_param *param, int plen){ 5951 struct ipw2100_param *param, int plen)
5952{
5963 5953
5964 struct ipw2100_priv *priv = ieee80211_priv(dev); 5954 struct ipw2100_priv *priv = ieee80211_priv(dev);
5965 struct ieee80211_device *ieee = priv->ieee; 5955 struct ieee80211_device *ieee = priv->ieee;
5966 u8 *buf; 5956 u8 *buf;
5967 5957
5968 if (! ieee->wpa_enabled) 5958 if (!ieee->wpa_enabled)
5969 return -EOPNOTSUPP; 5959 return -EOPNOTSUPP;
5970 5960
5971 if (param->u.wpa_ie.len > MAX_WPA_IE_LEN || 5961 if (param->u.wpa_ie.len > MAX_WPA_IE_LEN ||
5972 (param->u.wpa_ie.len && 5962 (param->u.wpa_ie.len && param->u.wpa_ie.data == NULL))
5973 param->u.wpa_ie.data==NULL))
5974 return -EINVAL; 5963 return -EINVAL;
5975 5964
5976 if (param->u.wpa_ie.len){ 5965 if (param->u.wpa_ie.len) {
5977 buf = kmalloc(param->u.wpa_ie.len, GFP_KERNEL); 5966 buf = kmalloc(param->u.wpa_ie.len, GFP_KERNEL);
5978 if (buf == NULL) 5967 if (buf == NULL)
5979 return -ENOMEM; 5968 return -ENOMEM;
@@ -5998,8 +5987,9 @@ static int ipw2100_wpa_set_wpa_ie(struct net_device *dev,
5998/* implementation borrowed from hostap driver */ 5987/* implementation borrowed from hostap driver */
5999 5988
6000static int ipw2100_wpa_set_encryption(struct net_device *dev, 5989static int ipw2100_wpa_set_encryption(struct net_device *dev,
6001 struct ipw2100_param *param, int param_len){ 5990 struct ipw2100_param *param,
6002 5991 int param_len)
5992{
6003 int ret = 0; 5993 int ret = 0;
6004 struct ipw2100_priv *priv = ieee80211_priv(dev); 5994 struct ipw2100_priv *priv = ieee80211_priv(dev);
6005 struct ieee80211_device *ieee = priv->ieee; 5995 struct ieee80211_device *ieee = priv->ieee;
@@ -6014,9 +6004,10 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6014 param->u.crypt.alg[IPW2100_CRYPT_ALG_NAME_LEN - 1] = '\0'; 6004 param->u.crypt.alg[IPW2100_CRYPT_ALG_NAME_LEN - 1] = '\0';
6015 6005
6016 if (param_len != 6006 if (param_len !=
6017 (int) ((char *) param->u.crypt.key - (char *) param) + 6007 (int)((char *)param->u.crypt.key - (char *)param) +
6018 param->u.crypt.key_len){ 6008 param->u.crypt.key_len) {
6019 IPW_DEBUG_INFO("Len mismatch %d, %d\n", param_len, param->u.crypt.key_len); 6009 IPW_DEBUG_INFO("Len mismatch %d, %d\n", param_len,
6010 param->u.crypt.key_len);
6020 return -EINVAL; 6011 return -EINVAL;
6021 } 6012 }
6022 if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && 6013 if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
@@ -6029,17 +6020,19 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6029 return -EINVAL; 6020 return -EINVAL;
6030 } 6021 }
6031 6022
6023 sec.flags |= SEC_ENABLED | SEC_ENCRYPT;
6032 if (strcmp(param->u.crypt.alg, "none") == 0) { 6024 if (strcmp(param->u.crypt.alg, "none") == 0) {
6033 if (crypt){ 6025 if (crypt) {
6034 sec.enabled = 0; 6026 sec.enabled = 0;
6027 sec.encrypt = 0;
6035 sec.level = SEC_LEVEL_0; 6028 sec.level = SEC_LEVEL_0;
6036 sec.flags |= SEC_ENABLED | SEC_LEVEL; 6029 sec.flags |= SEC_LEVEL;
6037 ieee80211_crypt_delayed_deinit(ieee, crypt); 6030 ieee80211_crypt_delayed_deinit(ieee, crypt);
6038 } 6031 }
6039 goto done; 6032 goto done;
6040 } 6033 }
6041 sec.enabled = 1; 6034 sec.enabled = 1;
6042 sec.flags |= SEC_ENABLED; 6035 sec.encrypt = 1;
6043 6036
6044 ops = ieee80211_get_crypto_ops(param->u.crypt.alg); 6037 ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
6045 if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { 6038 if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) {
@@ -6054,7 +6047,7 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6054 } 6047 }
6055 if (ops == NULL) { 6048 if (ops == NULL) {
6056 IPW_DEBUG_INFO("%s: unknown crypto alg '%s'\n", 6049 IPW_DEBUG_INFO("%s: unknown crypto alg '%s'\n",
6057 dev->name, param->u.crypt.alg); 6050 dev->name, param->u.crypt.alg);
6058 param->u.crypt.err = IPW2100_CRYPT_ERR_UNKNOWN_ALG; 6051 param->u.crypt.err = IPW2100_CRYPT_ERR_UNKNOWN_ALG;
6059 ret = -EINVAL; 6052 ret = -EINVAL;
6060 goto done; 6053 goto done;
@@ -6072,12 +6065,13 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6072 } 6065 }
6073 new_crypt->ops = ops; 6066 new_crypt->ops = ops;
6074 if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) 6067 if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
6075 new_crypt->priv = new_crypt->ops->init(param->u.crypt.idx); 6068 new_crypt->priv =
6069 new_crypt->ops->init(param->u.crypt.idx);
6076 6070
6077 if (new_crypt->priv == NULL) { 6071 if (new_crypt->priv == NULL) {
6078 kfree(new_crypt); 6072 kfree(new_crypt);
6079 param->u.crypt.err = 6073 param->u.crypt.err =
6080 IPW2100_CRYPT_ERR_CRYPT_INIT_FAILED; 6074 IPW2100_CRYPT_ERR_CRYPT_INIT_FAILED;
6081 ret = -EINVAL; 6075 ret = -EINVAL;
6082 goto done; 6076 goto done;
6083 } 6077 }
@@ -6089,24 +6083,25 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6089 (*crypt)->ops->set_key(param->u.crypt.key, 6083 (*crypt)->ops->set_key(param->u.crypt.key,
6090 param->u.crypt.key_len, param->u.crypt.seq, 6084 param->u.crypt.key_len, param->u.crypt.seq,
6091 (*crypt)->priv) < 0) { 6085 (*crypt)->priv) < 0) {
6092 IPW_DEBUG_INFO("%s: key setting failed\n", 6086 IPW_DEBUG_INFO("%s: key setting failed\n", dev->name);
6093 dev->name);
6094 param->u.crypt.err = IPW2100_CRYPT_ERR_KEY_SET_FAILED; 6087 param->u.crypt.err = IPW2100_CRYPT_ERR_KEY_SET_FAILED;
6095 ret = -EINVAL; 6088 ret = -EINVAL;
6096 goto done; 6089 goto done;
6097 } 6090 }
6098 6091
6099 if (param->u.crypt.set_tx){ 6092 if (param->u.crypt.set_tx) {
6100 ieee->tx_keyidx = param->u.crypt.idx; 6093 ieee->tx_keyidx = param->u.crypt.idx;
6101 sec.active_key = param->u.crypt.idx; 6094 sec.active_key = param->u.crypt.idx;
6102 sec.flags |= SEC_ACTIVE_KEY; 6095 sec.flags |= SEC_ACTIVE_KEY;
6103 } 6096 }
6104 6097
6105 if (ops->name != NULL){ 6098 if (ops->name != NULL) {
6106 6099
6107 if (strcmp(ops->name, "WEP") == 0) { 6100 if (strcmp(ops->name, "WEP") == 0) {
6108 memcpy(sec.keys[param->u.crypt.idx], param->u.crypt.key, param->u.crypt.key_len); 6101 memcpy(sec.keys[param->u.crypt.idx],
6109 sec.key_sizes[param->u.crypt.idx] = param->u.crypt.key_len; 6102 param->u.crypt.key, param->u.crypt.key_len);
6103 sec.key_sizes[param->u.crypt.idx] =
6104 param->u.crypt.key_len;
6110 sec.flags |= (1 << param->u.crypt.idx); 6105 sec.flags |= (1 << param->u.crypt.idx);
6111 sec.flags |= SEC_LEVEL; 6106 sec.flags |= SEC_LEVEL;
6112 sec.level = SEC_LEVEL_1; 6107 sec.level = SEC_LEVEL_1;
@@ -6118,7 +6113,7 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6118 sec.level = SEC_LEVEL_3; 6113 sec.level = SEC_LEVEL_3;
6119 } 6114 }
6120 } 6115 }
6121 done: 6116 done:
6122 if (ieee->set_security) 6117 if (ieee->set_security)
6123 ieee->set_security(ieee->dev, &sec); 6118 ieee->set_security(ieee->dev, &sec);
6124 6119
@@ -6129,8 +6124,7 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6129 * the callbacks structures used to initialize the 802.11 stack. */ 6124 * the callbacks structures used to initialize the 802.11 stack. */
6130 if (ieee->reset_on_keychange && 6125 if (ieee->reset_on_keychange &&
6131 ieee->iw_mode != IW_MODE_INFRA && 6126 ieee->iw_mode != IW_MODE_INFRA &&
6132 ieee->reset_port && 6127 ieee->reset_port && ieee->reset_port(dev)) {
6133 ieee->reset_port(dev)) {
6134 IPW_DEBUG_INFO("%s: reset_port failed\n", dev->name); 6128 IPW_DEBUG_INFO("%s: reset_port failed\n", dev->name);
6135 param->u.crypt.err = IPW2100_CRYPT_ERR_CARD_CONF_FAILED; 6129 param->u.crypt.err = IPW2100_CRYPT_ERR_CARD_CONF_FAILED;
6136 return -EINVAL; 6130 return -EINVAL;
@@ -6139,11 +6133,11 @@ static int ipw2100_wpa_set_encryption(struct net_device *dev,
6139 return ret; 6133 return ret;
6140} 6134}
6141 6135
6142 6136static int ipw2100_wpa_supplicant(struct net_device *dev, struct iw_point *p)
6143static int ipw2100_wpa_supplicant(struct net_device *dev, struct iw_point *p){ 6137{
6144 6138
6145 struct ipw2100_param *param; 6139 struct ipw2100_param *param;
6146 int ret=0; 6140 int ret = 0;
6147 6141
6148 IPW_DEBUG_IOCTL("wpa_supplicant: len=%d\n", p->length); 6142 IPW_DEBUG_IOCTL("wpa_supplicant: len=%d\n", p->length);
6149 6143
@@ -6154,12 +6148,12 @@ static int ipw2100_wpa_supplicant(struct net_device *dev, struct iw_point *p){
6154 if (param == NULL) 6148 if (param == NULL)
6155 return -ENOMEM; 6149 return -ENOMEM;
6156 6150
6157 if (copy_from_user(param, p->pointer, p->length)){ 6151 if (copy_from_user(param, p->pointer, p->length)) {
6158 kfree(param); 6152 kfree(param);
6159 return -EFAULT; 6153 return -EFAULT;
6160 } 6154 }
6161 6155
6162 switch (param->cmd){ 6156 switch (param->cmd) {
6163 6157
6164 case IPW2100_CMD_SET_WPA_PARAM: 6158 case IPW2100_CMD_SET_WPA_PARAM:
6165 ret = ipw2100_wpa_set_param(dev, param->u.wpa_param.name, 6159 ret = ipw2100_wpa_set_param(dev, param->u.wpa_param.name,
@@ -6180,8 +6174,9 @@ static int ipw2100_wpa_supplicant(struct net_device *dev, struct iw_point *p){
6180 break; 6174 break;
6181 6175
6182 default: 6176 default:
6183 printk(KERN_ERR DRV_NAME ": %s: Unknown WPA supplicant request: %d\n", 6177 printk(KERN_ERR DRV_NAME
6184 dev->name, param->cmd); 6178 ": %s: Unknown WPA supplicant request: %d\n", dev->name,
6179 param->cmd);
6185 ret = -EOPNOTSUPP; 6180 ret = -EOPNOTSUPP;
6186 6181
6187 } 6182 }
@@ -6192,27 +6187,23 @@ static int ipw2100_wpa_supplicant(struct net_device *dev, struct iw_point *p){
6192 kfree(param); 6187 kfree(param);
6193 return ret; 6188 return ret;
6194} 6189}
6195#endif /* CONFIG_IEEE80211_WPA */
6196 6190
6197static int ipw2100_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 6191static int ipw2100_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
6198{ 6192{
6199#ifdef CONFIG_IEEE80211_WPA 6193 struct iwreq *wrq = (struct iwreq *)rq;
6200 struct iwreq *wrq = (struct iwreq *) rq; 6194 int ret = -1;
6201 int ret=-1; 6195 switch (cmd) {
6202 switch (cmd){ 6196 case IPW2100_IOCTL_WPA_SUPPLICANT:
6203 case IPW2100_IOCTL_WPA_SUPPLICANT:
6204 ret = ipw2100_wpa_supplicant(dev, &wrq->u.data); 6197 ret = ipw2100_wpa_supplicant(dev, &wrq->u.data);
6205 return ret; 6198 return ret;
6206 6199
6207 default: 6200 default:
6208 return -EOPNOTSUPP; 6201 return -EOPNOTSUPP;
6209 } 6202 }
6210 6203
6211#endif /* CONFIG_IEEE80211_WPA */
6212
6213 return -EOPNOTSUPP; 6204 return -EOPNOTSUPP;
6214} 6205}
6215 6206#endif /* WIRELESS_EXT < 18 */
6216 6207
6217static void ipw_ethtool_get_drvinfo(struct net_device *dev, 6208static void ipw_ethtool_get_drvinfo(struct net_device *dev,
6218 struct ethtool_drvinfo *info) 6209 struct ethtool_drvinfo *info)
@@ -6234,14 +6225,13 @@ static void ipw_ethtool_get_drvinfo(struct net_device *dev,
6234 6225
6235static u32 ipw2100_ethtool_get_link(struct net_device *dev) 6226static u32 ipw2100_ethtool_get_link(struct net_device *dev)
6236{ 6227{
6237 struct ipw2100_priv *priv = ieee80211_priv(dev); 6228 struct ipw2100_priv *priv = ieee80211_priv(dev);
6238 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0; 6229 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
6239} 6230}
6240 6231
6241
6242static struct ethtool_ops ipw2100_ethtool_ops = { 6232static struct ethtool_ops ipw2100_ethtool_ops = {
6243 .get_link = ipw2100_ethtool_get_link, 6233 .get_link = ipw2100_ethtool_get_link,
6244 .get_drvinfo = ipw_ethtool_get_drvinfo, 6234 .get_drvinfo = ipw_ethtool_get_drvinfo,
6245}; 6235};
6246 6236
6247static void ipw2100_hang_check(void *adapter) 6237static void ipw2100_hang_check(void *adapter)
@@ -6286,7 +6276,6 @@ static void ipw2100_hang_check(void *adapter)
6286 spin_unlock_irqrestore(&priv->low_lock, flags); 6276 spin_unlock_irqrestore(&priv->low_lock, flags);
6287} 6277}
6288 6278
6289
6290static void ipw2100_rf_kill(void *adapter) 6279static void ipw2100_rf_kill(void *adapter)
6291{ 6280{
6292 struct ipw2100_priv *priv = adapter; 6281 struct ipw2100_priv *priv = adapter;
@@ -6311,7 +6300,7 @@ static void ipw2100_rf_kill(void *adapter)
6311 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still " 6300 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
6312 "enabled\n"); 6301 "enabled\n");
6313 6302
6314 exit_unlock: 6303 exit_unlock:
6315 spin_unlock_irqrestore(&priv->low_lock, flags); 6304 spin_unlock_irqrestore(&priv->low_lock, flags);
6316} 6305}
6317 6306
@@ -6319,11 +6308,10 @@ static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
6319 6308
6320/* Look into using netdev destructor to shutdown ieee80211? */ 6309/* Look into using netdev destructor to shutdown ieee80211? */
6321 6310
6322static struct net_device *ipw2100_alloc_device( 6311static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6323 struct pci_dev *pci_dev, 6312 void __iomem * base_addr,
6324 void __iomem *base_addr, 6313 unsigned long mem_start,
6325 unsigned long mem_start, 6314 unsigned long mem_len)
6326 unsigned long mem_len)
6327{ 6315{
6328 struct ipw2100_priv *priv; 6316 struct ipw2100_priv *priv;
6329 struct net_device *dev; 6317 struct net_device *dev;
@@ -6339,17 +6327,22 @@ static struct net_device *ipw2100_alloc_device(
6339 priv->ieee->hard_start_xmit = ipw2100_tx; 6327 priv->ieee->hard_start_xmit = ipw2100_tx;
6340 priv->ieee->set_security = shim__set_security; 6328 priv->ieee->set_security = shim__set_security;
6341 6329
6330 priv->ieee->perfect_rssi = -20;
6331 priv->ieee->worst_rssi = -85;
6332
6342 dev->open = ipw2100_open; 6333 dev->open = ipw2100_open;
6343 dev->stop = ipw2100_close; 6334 dev->stop = ipw2100_close;
6344 dev->init = ipw2100_net_init; 6335 dev->init = ipw2100_net_init;
6336#if WIRELESS_EXT < 18
6345 dev->do_ioctl = ipw2100_ioctl; 6337 dev->do_ioctl = ipw2100_ioctl;
6338#endif
6346 dev->get_stats = ipw2100_stats; 6339 dev->get_stats = ipw2100_stats;
6347 dev->ethtool_ops = &ipw2100_ethtool_ops; 6340 dev->ethtool_ops = &ipw2100_ethtool_ops;
6348 dev->tx_timeout = ipw2100_tx_timeout; 6341 dev->tx_timeout = ipw2100_tx_timeout;
6349 dev->wireless_handlers = &ipw2100_wx_handler_def; 6342 dev->wireless_handlers = &ipw2100_wx_handler_def;
6350 dev->get_wireless_stats = ipw2100_wx_wireless_stats; 6343 dev->get_wireless_stats = ipw2100_wx_wireless_stats;
6351 dev->set_mac_address = ipw2100_set_address; 6344 dev->set_mac_address = ipw2100_set_address;
6352 dev->watchdog_timeo = 3*HZ; 6345 dev->watchdog_timeo = 3 * HZ;
6353 dev->irq = 0; 6346 dev->irq = 0;
6354 6347
6355 dev->base_addr = (unsigned long)base_addr; 6348 dev->base_addr = (unsigned long)base_addr;
@@ -6362,22 +6355,19 @@ static struct net_device *ipw2100_alloc_device(
6362 * ends up causing problems. So, we just handle 6355 * ends up causing problems. So, we just handle
6363 * the WX extensions through the ipw2100_ioctl interface */ 6356 * the WX extensions through the ipw2100_ioctl interface */
6364 6357
6365
6366 /* memset() puts everything to 0, so we only have explicitely set 6358 /* memset() puts everything to 0, so we only have explicitely set
6367 * those values that need to be something else */ 6359 * those values that need to be something else */
6368 6360
6369 /* If power management is turned on, default to AUTO mode */ 6361 /* If power management is turned on, default to AUTO mode */
6370 priv->power_mode = IPW_POWER_AUTO; 6362 priv->power_mode = IPW_POWER_AUTO;
6371 6363
6372 6364#ifdef CONFIG_IPW2100_MONITOR
6373 6365 priv->config |= CFG_CRC_CHECK;
6374#ifdef CONFIG_IEEE80211_WPA 6366#endif
6375 priv->ieee->wpa_enabled = 0; 6367 priv->ieee->wpa_enabled = 0;
6376 priv->ieee->tkip_countermeasures = 0;
6377 priv->ieee->drop_unencrypted = 0; 6368 priv->ieee->drop_unencrypted = 0;
6378 priv->ieee->privacy_invoked = 0; 6369 priv->ieee->privacy_invoked = 0;
6379 priv->ieee->ieee802_1x = 1; 6370 priv->ieee->ieee802_1x = 1;
6380#endif /* CONFIG_IEEE80211_WPA */
6381 6371
6382 /* Set module parameters */ 6372 /* Set module parameters */
6383 switch (mode) { 6373 switch (mode) {
@@ -6399,8 +6389,7 @@ static struct net_device *ipw2100_alloc_device(
6399 priv->status |= STATUS_RF_KILL_SW; 6389 priv->status |= STATUS_RF_KILL_SW;
6400 6390
6401 if (channel != 0 && 6391 if (channel != 0 &&
6402 ((channel >= REG_MIN_CHANNEL) && 6392 ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
6403 (channel <= REG_MAX_CHANNEL))) {
6404 priv->config |= CFG_STATIC_CHANNEL; 6393 priv->config |= CFG_STATIC_CHANNEL;
6405 priv->channel = channel; 6394 priv->channel = channel;
6406 } 6395 }
@@ -6439,12 +6428,8 @@ static struct net_device *ipw2100_alloc_device(
6439 INIT_LIST_HEAD(&priv->fw_pend_list); 6428 INIT_LIST_HEAD(&priv->fw_pend_list);
6440 INIT_STAT(&priv->fw_pend_stat); 6429 INIT_STAT(&priv->fw_pend_stat);
6441 6430
6442
6443#ifdef CONFIG_SOFTWARE_SUSPEND2
6444 priv->workqueue = create_workqueue(DRV_NAME, 0);
6445#else
6446 priv->workqueue = create_workqueue(DRV_NAME); 6431 priv->workqueue = create_workqueue(DRV_NAME);
6447#endif 6432
6448 INIT_WORK(&priv->reset_work, 6433 INIT_WORK(&priv->reset_work,
6449 (void (*)(void *))ipw2100_reset_adapter, priv); 6434 (void (*)(void *))ipw2100_reset_adapter, priv);
6450 INIT_WORK(&priv->security_work, 6435 INIT_WORK(&priv->security_work,
@@ -6533,7 +6518,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6533 return err; 6518 return err;
6534 } 6519 }
6535 6520
6536 /* We disable the RETRY_TIMEOUT register (0x41) to keep 6521 /* We disable the RETRY_TIMEOUT register (0x41) to keep
6537 * PCI Tx retries from interfering with C3 CPU state */ 6522 * PCI Tx retries from interfering with C3 CPU state */
6538 pci_read_config_dword(pci_dev, 0x40, &val); 6523 pci_read_config_dword(pci_dev, 0x40, &val);
6539 if ((val & 0x0000ff00) != 0) 6524 if ((val & 0x0000ff00) != 0)
@@ -6564,12 +6549,10 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6564 ipw2100_queues_initialize(priv); 6549 ipw2100_queues_initialize(priv);
6565 6550
6566 err = request_irq(pci_dev->irq, 6551 err = request_irq(pci_dev->irq,
6567 ipw2100_interrupt, SA_SHIRQ, 6552 ipw2100_interrupt, SA_SHIRQ, dev->name, priv);
6568 dev->name, priv);
6569 if (err) { 6553 if (err) {
6570 printk(KERN_WARNING DRV_NAME 6554 printk(KERN_WARNING DRV_NAME
6571 "Error calling request_irq: %d.\n", 6555 "Error calling request_irq: %d.\n", pci_dev->irq);
6572 pci_dev->irq);
6573 goto fail; 6556 goto fail;
6574 } 6557 }
6575 dev->irq = pci_dev->irq; 6558 dev->irq = pci_dev->irq;
@@ -6604,7 +6587,6 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6604 6587
6605 /* perform this after register_netdev so that dev->name is set */ 6588 /* perform this after register_netdev so that dev->name is set */
6606 sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); 6589 sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6607 netif_carrier_off(dev);
6608 6590
6609 /* If the RF Kill switch is disabled, go ahead and complete the 6591 /* If the RF Kill switch is disabled, go ahead and complete the
6610 * startup sequence */ 6592 * startup sequence */
@@ -6632,10 +6614,10 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6632 6614
6633 return 0; 6615 return 0;
6634 6616
6635 fail_unlock: 6617 fail_unlock:
6636 up(&priv->action_sem); 6618 up(&priv->action_sem);
6637 6619
6638 fail: 6620 fail:
6639 if (dev) { 6621 if (dev) {
6640 if (registered) 6622 if (registered)
6641 unregister_netdev(dev); 6623 unregister_netdev(dev);
@@ -6651,7 +6633,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6651 6633
6652 /* These are safe to call even if they weren't allocated */ 6634 /* These are safe to call even if they weren't allocated */
6653 ipw2100_queues_free(priv); 6635 ipw2100_queues_free(priv);
6654 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); 6636 sysfs_remove_group(&pci_dev->dev.kobj,
6637 &ipw2100_attribute_group);
6655 6638
6656 free_ieee80211(dev); 6639 free_ieee80211(dev);
6657 pci_set_drvdata(pci_dev, NULL); 6640 pci_set_drvdata(pci_dev, NULL);
@@ -6677,7 +6660,8 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6677 priv->status &= ~STATUS_INITIALIZED; 6660 priv->status &= ~STATUS_INITIALIZED;
6678 6661
6679 dev = priv->net_dev; 6662 dev = priv->net_dev;
6680 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group); 6663 sysfs_remove_group(&pci_dev->dev.kobj,
6664 &ipw2100_attribute_group);
6681 6665
6682#ifdef CONFIG_PM 6666#ifdef CONFIG_PM
6683 if (ipw2100_firmware.version) 6667 if (ipw2100_firmware.version)
@@ -6719,19 +6703,13 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6719 IPW_DEBUG_INFO("exit\n"); 6703 IPW_DEBUG_INFO("exit\n");
6720} 6704}
6721 6705
6722
6723#ifdef CONFIG_PM 6706#ifdef CONFIG_PM
6724#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
6725static int ipw2100_suspend(struct pci_dev *pci_dev, u32 state)
6726#else
6727static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state) 6707static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6728#endif
6729{ 6708{
6730 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev); 6709 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6731 struct net_device *dev = priv->net_dev; 6710 struct net_device *dev = priv->net_dev;
6732 6711
6733 IPW_DEBUG_INFO("%s: Going into suspend...\n", 6712 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6734 dev->name);
6735 6713
6736 down(&priv->action_sem); 6714 down(&priv->action_sem);
6737 if (priv->status & STATUS_INITIALIZED) { 6715 if (priv->status & STATUS_INITIALIZED) {
@@ -6743,7 +6721,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6743 netif_device_detach(dev); 6721 netif_device_detach(dev);
6744 6722
6745 pci_save_state(pci_dev); 6723 pci_save_state(pci_dev);
6746 pci_disable_device (pci_dev); 6724 pci_disable_device(pci_dev);
6747 pci_set_power_state(pci_dev, PCI_D3hot); 6725 pci_set_power_state(pci_dev, PCI_D3hot);
6748 6726
6749 up(&priv->action_sem); 6727 up(&priv->action_sem);
@@ -6762,8 +6740,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
6762 6740
6763 down(&priv->action_sem); 6741 down(&priv->action_sem);
6764 6742
6765 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", 6743 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6766 dev->name);
6767 6744
6768 pci_set_power_state(pci_dev, PCI_D0); 6745 pci_set_power_state(pci_dev, PCI_D0);
6769 pci_enable_device(pci_dev); 6746 pci_enable_device(pci_dev);
@@ -6783,9 +6760,9 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
6783 * the queue of needed */ 6760 * the queue of needed */
6784 netif_device_attach(dev); 6761 netif_device_attach(dev);
6785 6762
6786 /* Bring the device back up */ 6763 /* Bring the device back up */
6787 if (!(priv->status & STATUS_RF_KILL_SW)) 6764 if (!(priv->status & STATUS_RF_KILL_SW))
6788 ipw2100_up(priv, 0); 6765 ipw2100_up(priv, 0);
6789 6766
6790 up(&priv->action_sem); 6767 up(&priv->action_sem);
6791 6768
@@ -6793,56 +6770,55 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
6793} 6770}
6794#endif 6771#endif
6795 6772
6796
6797#define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x } 6773#define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6798 6774
6799static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = { 6775static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = {
6800 IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */ 6776 IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */
6801 IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */ 6777 IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */
6802 IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */ 6778 IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */
6803 IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */ 6779 IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */
6804 IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */ 6780 IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */
6805 IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */ 6781 IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */
6806 IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */ 6782 IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */
6807 IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */ 6783 IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */
6808 IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */ 6784 IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */
6809 IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */ 6785 IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */
6810 IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */ 6786 IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */
6811 IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */ 6787 IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */
6812 IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */ 6788 IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */
6813 6789
6814 IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */ 6790 IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */
6815 IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */ 6791 IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */
6816 IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */ 6792 IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */
6817 IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */ 6793 IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */
6818 IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */ 6794 IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */
6819 6795
6820 IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */ 6796 IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */
6821 IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */ 6797 IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */
6822 IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */ 6798 IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */
6823 IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */ 6799 IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */
6824 IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */ 6800 IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */
6825 IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */ 6801 IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */
6826 IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */ 6802 IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */
6827 6803
6828 IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */ 6804 IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */
6829 6805
6830 IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */ 6806 IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */
6831 IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */ 6807 IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */
6832 IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */ 6808 IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */
6833 IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */ 6809 IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */
6834 IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */ 6810 IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */
6835 IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */ 6811 IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */
6836 IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */ 6812 IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */
6837 6813
6838 IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */ 6814 IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */
6839 IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */ 6815 IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */
6840 IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */ 6816 IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */
6841 IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */ 6817 IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */
6842 IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */ 6818 IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */
6843 IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */ 6819 IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */
6844 6820
6845 IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */ 6821 IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */
6846 {0,}, 6822 {0,},
6847}; 6823};
6848 6824
@@ -6859,7 +6835,6 @@ static struct pci_driver ipw2100_pci_driver = {
6859#endif 6835#endif
6860}; 6836};
6861 6837
6862
6863/** 6838/**
6864 * Initialize the ipw2100 driver/module 6839 * Initialize the ipw2100 driver/module
6865 * 6840 *
@@ -6876,10 +6851,6 @@ static int __init ipw2100_init(void)
6876 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION); 6851 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6877 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT); 6852 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6878 6853
6879#ifdef CONFIG_IEEE80211_NOWEP
6880 IPW_DEBUG_INFO(DRV_NAME ": Compiled with WEP disabled.\n");
6881#endif
6882
6883 ret = pci_module_init(&ipw2100_pci_driver); 6854 ret = pci_module_init(&ipw2100_pci_driver);
6884 6855
6885#ifdef CONFIG_IPW_DEBUG 6856#ifdef CONFIG_IPW_DEBUG
@@ -6891,7 +6862,6 @@ static int __init ipw2100_init(void)
6891 return ret; 6862 return ret;
6892} 6863}
6893 6864
6894
6895/** 6865/**
6896 * Cleanup ipw2100 driver registration 6866 * Cleanup ipw2100 driver registration
6897 */ 6867 */
@@ -6947,7 +6917,6 @@ static int ipw2100_wx_get_name(struct net_device *dev,
6947 return 0; 6917 return 0;
6948} 6918}
6949 6919
6950
6951static int ipw2100_wx_set_freq(struct net_device *dev, 6920static int ipw2100_wx_set_freq(struct net_device *dev,
6952 struct iw_request_info *info, 6921 struct iw_request_info *info,
6953 union iwreq_data *wrqu, char *extra) 6922 union iwreq_data *wrqu, char *extra)
@@ -6967,8 +6936,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev,
6967 6936
6968 /* if setting by freq convert to channel */ 6937 /* if setting by freq convert to channel */
6969 if (fwrq->e == 1) { 6938 if (fwrq->e == 1) {
6970 if ((fwrq->m >= (int) 2.412e8 && 6939 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6971 fwrq->m <= (int) 2.487e8)) {
6972 int f = fwrq->m / 100000; 6940 int f = fwrq->m / 100000;
6973 int c = 0; 6941 int c = 0;
6974 6942
@@ -6982,19 +6950,19 @@ static int ipw2100_wx_set_freq(struct net_device *dev,
6982 } 6950 }
6983 } 6951 }
6984 6952
6985 if (fwrq->e > 0 || fwrq->m > 1000) 6953 if (fwrq->e > 0 || fwrq->m > 1000) {
6986 return -EOPNOTSUPP; 6954 err = -EOPNOTSUPP;
6987 else { /* Set the channel */ 6955 goto done;
6956 } else { /* Set the channel */
6988 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m); 6957 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
6989 err = ipw2100_set_channel(priv, fwrq->m, 0); 6958 err = ipw2100_set_channel(priv, fwrq->m, 0);
6990 } 6959 }
6991 6960
6992 done: 6961 done:
6993 up(&priv->action_sem); 6962 up(&priv->action_sem);
6994 return err; 6963 return err;
6995} 6964}
6996 6965
6997
6998static int ipw2100_wx_get_freq(struct net_device *dev, 6966static int ipw2100_wx_get_freq(struct net_device *dev,
6999 struct iw_request_info *info, 6967 struct iw_request_info *info,
7000 union iwreq_data *wrqu, char *extra) 6968 union iwreq_data *wrqu, char *extra)
@@ -7043,7 +7011,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev,
7043 case IW_MODE_MONITOR: 7011 case IW_MODE_MONITOR:
7044 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR); 7012 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7045 break; 7013 break;
7046#endif /* CONFIG_IPW2100_MONITOR */ 7014#endif /* CONFIG_IPW2100_MONITOR */
7047 case IW_MODE_ADHOC: 7015 case IW_MODE_ADHOC:
7048 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC); 7016 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
7049 break; 7017 break;
@@ -7054,9 +7022,9 @@ static int ipw2100_wx_set_mode(struct net_device *dev,
7054 break; 7022 break;
7055 } 7023 }
7056 7024
7057done: 7025 done:
7058 up(&priv->action_sem); 7026 up(&priv->action_sem);
7059 return err; 7027 return err;
7060} 7028}
7061 7029
7062static int ipw2100_wx_get_mode(struct net_device *dev, 7030static int ipw2100_wx_get_mode(struct net_device *dev,
@@ -7075,7 +7043,6 @@ static int ipw2100_wx_get_mode(struct net_device *dev,
7075 return 0; 7043 return 0;
7076} 7044}
7077 7045
7078
7079#define POWER_MODES 5 7046#define POWER_MODES 5
7080 7047
7081/* Values are in microsecond */ 7048/* Values are in microsecond */
@@ -7122,19 +7089,19 @@ static int ipw2100_wx_get_range(struct net_device *dev,
7122 /* ~5 Mb/s real (802.11b) */ 7089 /* ~5 Mb/s real (802.11b) */
7123 range->throughput = 5 * 1000 * 1000; 7090 range->throughput = 5 * 1000 * 1000;
7124 7091
7125// range->sensitivity; /* signal level threshold range */ 7092// range->sensitivity; /* signal level threshold range */
7126 7093
7127 range->max_qual.qual = 100; 7094 range->max_qual.qual = 100;
7128 /* TODO: Find real max RSSI and stick here */ 7095 /* TODO: Find real max RSSI and stick here */
7129 range->max_qual.level = 0; 7096 range->max_qual.level = 0;
7130 range->max_qual.noise = 0; 7097 range->max_qual.noise = 0;
7131 range->max_qual.updated = 7; /* Updated all three */ 7098 range->max_qual.updated = 7; /* Updated all three */
7132 7099
7133 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */ 7100 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
7134 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */ 7101 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
7135 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM; 7102 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
7136 range->avg_qual.noise = 0; 7103 range->avg_qual.noise = 0;
7137 range->avg_qual.updated = 7; /* Updated all three */ 7104 range->avg_qual.updated = 7; /* Updated all three */
7138 7105
7139 range->num_bitrates = RATE_COUNT; 7106 range->num_bitrates = RATE_COUNT;
7140 7107
@@ -7148,61 +7115,62 @@ static int ipw2100_wx_get_range(struct net_device *dev,
7148 range->max_frag = MAX_FRAG_THRESHOLD; 7115 range->max_frag = MAX_FRAG_THRESHOLD;
7149 7116
7150 range->min_pmp = period_duration[0]; /* Minimal PM period */ 7117 range->min_pmp = period_duration[0]; /* Minimal PM period */
7151 range->max_pmp = period_duration[POWER_MODES-1];/* Maximal PM period */ 7118 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */
7152 range->min_pmt = timeout_duration[POWER_MODES-1]; /* Minimal PM timeout */ 7119 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */
7153 range->max_pmt = timeout_duration[0];/* Maximal PM timeout */ 7120 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */
7154 7121
7155 /* How to decode max/min PM period */ 7122 /* How to decode max/min PM period */
7156 range->pmp_flags = IW_POWER_PERIOD; 7123 range->pmp_flags = IW_POWER_PERIOD;
7157 /* How to decode max/min PM period */ 7124 /* How to decode max/min PM period */
7158 range->pmt_flags = IW_POWER_TIMEOUT; 7125 range->pmt_flags = IW_POWER_TIMEOUT;
7159 /* What PM options are supported */ 7126 /* What PM options are supported */
7160 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD; 7127 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
7161 7128
7162 range->encoding_size[0] = 5; 7129 range->encoding_size[0] = 5;
7163 range->encoding_size[1] = 13; /* Different token sizes */ 7130 range->encoding_size[1] = 13; /* Different token sizes */
7164 range->num_encoding_sizes = 2; /* Number of entry in the list */ 7131 range->num_encoding_sizes = 2; /* Number of entry in the list */
7165 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */ 7132 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */
7166// range->encoding_login_index; /* token index for login token */ 7133// range->encoding_login_index; /* token index for login token */
7167 7134
7168 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { 7135 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7169 range->txpower_capa = IW_TXPOW_DBM; 7136 range->txpower_capa = IW_TXPOW_DBM;
7170 range->num_txpower = IW_MAX_TXPOWER; 7137 range->num_txpower = IW_MAX_TXPOWER;
7171 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16); i < IW_MAX_TXPOWER; 7138 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
7172 i++, level -= ((IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM) * 16) / 7139 i < IW_MAX_TXPOWER;
7173 (IW_MAX_TXPOWER - 1)) 7140 i++, level -=
7141 ((IPW_TX_POWER_MAX_DBM -
7142 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
7174 range->txpower[i] = level / 16; 7143 range->txpower[i] = level / 16;
7175 } else { 7144 } else {
7176 range->txpower_capa = 0; 7145 range->txpower_capa = 0;
7177 range->num_txpower = 0; 7146 range->num_txpower = 0;
7178 } 7147 }
7179 7148
7180
7181 /* Set the Wireless Extension versions */ 7149 /* Set the Wireless Extension versions */
7182 range->we_version_compiled = WIRELESS_EXT; 7150 range->we_version_compiled = WIRELESS_EXT;
7183 range->we_version_source = 16; 7151 range->we_version_source = 16;
7184 7152
7185// range->retry_capa; /* What retry options are supported */ 7153// range->retry_capa; /* What retry options are supported */
7186// range->retry_flags; /* How to decode max/min retry limit */ 7154// range->retry_flags; /* How to decode max/min retry limit */
7187// range->r_time_flags; /* How to decode max/min retry life */ 7155// range->r_time_flags; /* How to decode max/min retry life */
7188// range->min_retry; /* Minimal number of retries */ 7156// range->min_retry; /* Minimal number of retries */
7189// range->max_retry; /* Maximal number of retries */ 7157// range->max_retry; /* Maximal number of retries */
7190// range->min_r_time; /* Minimal retry lifetime */ 7158// range->min_r_time; /* Minimal retry lifetime */
7191// range->max_r_time; /* Maximal retry lifetime */ 7159// range->max_r_time; /* Maximal retry lifetime */
7192 7160
7193 range->num_channels = FREQ_COUNT; 7161 range->num_channels = FREQ_COUNT;
7194 7162
7195 val = 0; 7163 val = 0;
7196 for (i = 0; i < FREQ_COUNT; i++) { 7164 for (i = 0; i < FREQ_COUNT; i++) {
7197 // TODO: Include only legal frequencies for some countries 7165 // TODO: Include only legal frequencies for some countries
7198// if (local->channel_mask & (1 << i)) { 7166// if (local->channel_mask & (1 << i)) {
7199 range->freq[val].i = i + 1; 7167 range->freq[val].i = i + 1;
7200 range->freq[val].m = ipw2100_frequencies[i] * 100000; 7168 range->freq[val].m = ipw2100_frequencies[i] * 100000;
7201 range->freq[val].e = 1; 7169 range->freq[val].e = 1;
7202 val++; 7170 val++;
7203// } 7171// }
7204 if (val == IW_MAX_FREQUENCIES) 7172 if (val == IW_MAX_FREQUENCIES)
7205 break; 7173 break;
7206 } 7174 }
7207 range->num_frequency = val; 7175 range->num_frequency = val;
7208 7176
@@ -7257,7 +7225,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev,
7257 wrqu->ap_addr.sa_data[4] & 0xff, 7225 wrqu->ap_addr.sa_data[4] & 0xff,
7258 wrqu->ap_addr.sa_data[5] & 0xff); 7226 wrqu->ap_addr.sa_data[5] & 0xff);
7259 7227
7260 done: 7228 done:
7261 up(&priv->action_sem); 7229 up(&priv->action_sem);
7262 return err; 7230 return err;
7263} 7231}
@@ -7274,10 +7242,9 @@ static int ipw2100_wx_get_wap(struct net_device *dev,
7274 7242
7275 /* If we are associated, trying to associate, or have a statically 7243 /* If we are associated, trying to associate, or have a statically
7276 * configured BSSID then return that; otherwise return ANY */ 7244 * configured BSSID then return that; otherwise return ANY */
7277 if (priv->config & CFG_STATIC_BSSID || 7245 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
7278 priv->status & STATUS_ASSOCIATED) {
7279 wrqu->ap_addr.sa_family = ARPHRD_ETHER; 7246 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
7280 memcpy(wrqu->ap_addr.sa_data, &priv->bssid, ETH_ALEN); 7247 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
7281 } else 7248 } else
7282 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 7249 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
7283 7250
@@ -7291,7 +7258,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev,
7291 union iwreq_data *wrqu, char *extra) 7258 union iwreq_data *wrqu, char *extra)
7292{ 7259{
7293 struct ipw2100_priv *priv = ieee80211_priv(dev); 7260 struct ipw2100_priv *priv = ieee80211_priv(dev);
7294 char *essid = ""; /* ANY */ 7261 char *essid = ""; /* ANY */
7295 int length = 0; 7262 int length = 0;
7296 int err = 0; 7263 int err = 0;
7297 7264
@@ -7331,7 +7298,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev,
7331 7298
7332 err = ipw2100_set_essid(priv, essid, length, 0); 7299 err = ipw2100_set_essid(priv, essid, length, 0);
7333 7300
7334 done: 7301 done:
7335 up(&priv->action_sem); 7302 up(&priv->action_sem);
7336 return err; 7303 return err;
7337} 7304}
@@ -7348,17 +7315,16 @@ static int ipw2100_wx_get_essid(struct net_device *dev,
7348 7315
7349 /* If we are associated, trying to associate, or have a statically 7316 /* If we are associated, trying to associate, or have a statically
7350 * configured ESSID then return that; otherwise return ANY */ 7317 * configured ESSID then return that; otherwise return ANY */
7351 if (priv->config & CFG_STATIC_ESSID || 7318 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
7352 priv->status & STATUS_ASSOCIATED) {
7353 IPW_DEBUG_WX("Getting essid: '%s'\n", 7319 IPW_DEBUG_WX("Getting essid: '%s'\n",
7354 escape_essid(priv->essid, priv->essid_len)); 7320 escape_essid(priv->essid, priv->essid_len));
7355 memcpy(extra, priv->essid, priv->essid_len); 7321 memcpy(extra, priv->essid, priv->essid_len);
7356 wrqu->essid.length = priv->essid_len; 7322 wrqu->essid.length = priv->essid_len;
7357 wrqu->essid.flags = 1; /* active */ 7323 wrqu->essid.flags = 1; /* active */
7358 } else { 7324 } else {
7359 IPW_DEBUG_WX("Getting essid: ANY\n"); 7325 IPW_DEBUG_WX("Getting essid: ANY\n");
7360 wrqu->essid.length = 0; 7326 wrqu->essid.length = 0;
7361 wrqu->essid.flags = 0; /* active */ 7327 wrqu->essid.flags = 0; /* active */
7362 } 7328 }
7363 7329
7364 return 0; 7330 return 0;
@@ -7377,9 +7343,9 @@ static int ipw2100_wx_set_nick(struct net_device *dev,
7377 if (wrqu->data.length > IW_ESSID_MAX_SIZE) 7343 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
7378 return -E2BIG; 7344 return -E2BIG;
7379 7345
7380 wrqu->data.length = min((size_t)wrqu->data.length, sizeof(priv->nick)); 7346 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
7381 memset(priv->nick, 0, sizeof(priv->nick)); 7347 memset(priv->nick, 0, sizeof(priv->nick));
7382 memcpy(priv->nick, extra, wrqu->data.length); 7348 memcpy(priv->nick, extra, wrqu->data.length);
7383 7349
7384 IPW_DEBUG_WX("SET Nickname -> %s \n", priv->nick); 7350 IPW_DEBUG_WX("SET Nickname -> %s \n", priv->nick);
7385 7351
@@ -7398,7 +7364,7 @@ static int ipw2100_wx_get_nick(struct net_device *dev,
7398 7364
7399 wrqu->data.length = strlen(priv->nick) + 1; 7365 wrqu->data.length = strlen(priv->nick) + 1;
7400 memcpy(extra, priv->nick, wrqu->data.length); 7366 memcpy(extra, priv->nick, wrqu->data.length);
7401 wrqu->data.flags = 1; /* active */ 7367 wrqu->data.flags = 1; /* active */
7402 7368
7403 IPW_DEBUG_WX("GET Nickname -> %s \n", extra); 7369 IPW_DEBUG_WX("GET Nickname -> %s \n", extra);
7404 7370
@@ -7440,12 +7406,11 @@ static int ipw2100_wx_set_rate(struct net_device *dev,
7440 err = ipw2100_set_tx_rates(priv, rate, 0); 7406 err = ipw2100_set_tx_rates(priv, rate, 0);
7441 7407
7442 IPW_DEBUG_WX("SET Rate -> %04X \n", rate); 7408 IPW_DEBUG_WX("SET Rate -> %04X \n", rate);
7443 done: 7409 done:
7444 up(&priv->action_sem); 7410 up(&priv->action_sem);
7445 return err; 7411 return err;
7446} 7412}
7447 7413
7448
7449static int ipw2100_wx_get_rate(struct net_device *dev, 7414static int ipw2100_wx_get_rate(struct net_device *dev,
7450 struct iw_request_info *info, 7415 struct iw_request_info *info,
7451 union iwreq_data *wrqu, char *extra) 7416 union iwreq_data *wrqu, char *extra)
@@ -7493,7 +7458,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev,
7493 7458
7494 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); 7459 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
7495 7460
7496 done: 7461 done:
7497 up(&priv->action_sem); 7462 up(&priv->action_sem);
7498 return err; 7463 return err;
7499} 7464}
@@ -7518,8 +7483,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev,
7518 if (wrqu->rts.disabled) 7483 if (wrqu->rts.disabled)
7519 value = priv->rts_threshold | RTS_DISABLED; 7484 value = priv->rts_threshold | RTS_DISABLED;
7520 else { 7485 else {
7521 if (wrqu->rts.value < 1 || 7486 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7522 wrqu->rts.value > 2304) {
7523 err = -EINVAL; 7487 err = -EINVAL;
7524 goto done; 7488 goto done;
7525 } 7489 }
@@ -7529,7 +7493,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev,
7529 err = ipw2100_set_rts_threshold(priv, value); 7493 err = ipw2100_set_rts_threshold(priv, value);
7530 7494
7531 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value); 7495 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value);
7532 done: 7496 done:
7533 up(&priv->action_sem); 7497 up(&priv->action_sem);
7534 return err; 7498 return err;
7535} 7499}
@@ -7545,7 +7509,7 @@ static int ipw2100_wx_get_rts(struct net_device *dev,
7545 struct ipw2100_priv *priv = ieee80211_priv(dev); 7509 struct ipw2100_priv *priv = ieee80211_priv(dev);
7546 7510
7547 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED; 7511 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7548 wrqu->rts.fixed = 1; /* no auto select */ 7512 wrqu->rts.fixed = 1; /* no auto select */
7549 7513
7550 /* If RTS is set to the default value, then it is disabled */ 7514 /* If RTS is set to the default value, then it is disabled */
7551 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0; 7515 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
@@ -7572,8 +7536,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
7572 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM) 7536 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7573 return -EINVAL; 7537 return -EINVAL;
7574 7538
7575 value = (wrqu->txpower.value - IPW_TX_POWER_MIN_DBM) * 16 / 7539 value = wrqu->txpower.value;
7576 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
7577 } 7540 }
7578 7541
7579 down(&priv->action_sem); 7542 down(&priv->action_sem);
@@ -7586,7 +7549,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
7586 7549
7587 IPW_DEBUG_WX("SET TX Power -> %d \n", value); 7550 IPW_DEBUG_WX("SET TX Power -> %d \n", value);
7588 7551
7589 done: 7552 done:
7590 up(&priv->action_sem); 7553 up(&priv->action_sem);
7591 return err; 7554 return err;
7592} 7555}
@@ -7613,11 +7576,7 @@ static int ipw2100_wx_get_txpow(struct net_device *dev,
7613 } else { 7576 } else {
7614 wrqu->power.disabled = 0; 7577 wrqu->power.disabled = 0;
7615 wrqu->power.fixed = 1; 7578 wrqu->power.fixed = 1;
7616 wrqu->power.value = 7579 wrqu->power.value = priv->tx_power;
7617 (priv->tx_power *
7618 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM)) /
7619 (IPW_TX_POWER_MAX - IPW_TX_POWER_MIN) +
7620 IPW_TX_POWER_MIN_DBM;
7621 } 7580 }
7622 7581
7623 wrqu->power.flags = IW_TXPOW_DBM; 7582 wrqu->power.flags = IW_TXPOW_DBM;
@@ -7682,8 +7641,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev,
7682 struct ipw2100_priv *priv = ieee80211_priv(dev); 7641 struct ipw2100_priv *priv = ieee80211_priv(dev);
7683 int err = 0; 7642 int err = 0;
7684 7643
7685 if (wrqu->retry.flags & IW_RETRY_LIFETIME || 7644 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7686 wrqu->retry.disabled)
7687 return -EINVAL; 7645 return -EINVAL;
7688 7646
7689 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) 7647 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
@@ -7698,14 +7656,14 @@ static int ipw2100_wx_set_retry(struct net_device *dev,
7698 if (wrqu->retry.flags & IW_RETRY_MIN) { 7656 if (wrqu->retry.flags & IW_RETRY_MIN) {
7699 err = ipw2100_set_short_retry(priv, wrqu->retry.value); 7657 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7700 IPW_DEBUG_WX("SET Short Retry Limit -> %d \n", 7658 IPW_DEBUG_WX("SET Short Retry Limit -> %d \n",
7701 wrqu->retry.value); 7659 wrqu->retry.value);
7702 goto done; 7660 goto done;
7703 } 7661 }
7704 7662
7705 if (wrqu->retry.flags & IW_RETRY_MAX) { 7663 if (wrqu->retry.flags & IW_RETRY_MAX) {
7706 err = ipw2100_set_long_retry(priv, wrqu->retry.value); 7664 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7707 IPW_DEBUG_WX("SET Long Retry Limit -> %d \n", 7665 IPW_DEBUG_WX("SET Long Retry Limit -> %d \n",
7708 wrqu->retry.value); 7666 wrqu->retry.value);
7709 goto done; 7667 goto done;
7710 } 7668 }
7711 7669
@@ -7715,7 +7673,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev,
7715 7673
7716 IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value); 7674 IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value);
7717 7675
7718 done: 7676 done:
7719 up(&priv->action_sem); 7677 up(&priv->action_sem);
7720 return err; 7678 return err;
7721} 7679}
@@ -7730,20 +7688,19 @@ static int ipw2100_wx_get_retry(struct net_device *dev,
7730 7688
7731 struct ipw2100_priv *priv = ieee80211_priv(dev); 7689 struct ipw2100_priv *priv = ieee80211_priv(dev);
7732 7690
7733 wrqu->retry.disabled = 0; /* can't be disabled */ 7691 wrqu->retry.disabled = 0; /* can't be disabled */
7734 7692
7735 if ((wrqu->retry.flags & IW_RETRY_TYPE) == 7693 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7736 IW_RETRY_LIFETIME)
7737 return -EINVAL; 7694 return -EINVAL;
7738 7695
7739 if (wrqu->retry.flags & IW_RETRY_MAX) { 7696 if (wrqu->retry.flags & IW_RETRY_MAX) {
7740 wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; 7697 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
7741 wrqu->retry.value = priv->long_retry_limit; 7698 wrqu->retry.value = priv->long_retry_limit;
7742 } else { 7699 } else {
7743 wrqu->retry.flags = 7700 wrqu->retry.flags =
7744 (priv->short_retry_limit != 7701 (priv->short_retry_limit !=
7745 priv->long_retry_limit) ? 7702 priv->long_retry_limit) ?
7746 IW_RETRY_LIMIT & IW_RETRY_MIN : IW_RETRY_LIMIT; 7703 IW_RETRY_LIMIT | IW_RETRY_MIN : IW_RETRY_LIMIT;
7747 7704
7748 wrqu->retry.value = priv->short_retry_limit; 7705 wrqu->retry.value = priv->short_retry_limit;
7749 } 7706 }
@@ -7767,15 +7724,14 @@ static int ipw2100_wx_set_scan(struct net_device *dev,
7767 } 7724 }
7768 7725
7769 IPW_DEBUG_WX("Initiating scan...\n"); 7726 IPW_DEBUG_WX("Initiating scan...\n");
7770 if (ipw2100_set_scan_options(priv) || 7727 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7771 ipw2100_start_scan(priv)) {
7772 IPW_DEBUG_WX("Start scan failed.\n"); 7728 IPW_DEBUG_WX("Start scan failed.\n");
7773 7729
7774 /* TODO: Mark a scan as pending so when hardware initialized 7730 /* TODO: Mark a scan as pending so when hardware initialized
7775 * a scan starts */ 7731 * a scan starts */
7776 } 7732 }
7777 7733
7778 done: 7734 done:
7779 up(&priv->action_sem); 7735 up(&priv->action_sem);
7780 return err; 7736 return err;
7781} 7737}
@@ -7792,7 +7748,6 @@ static int ipw2100_wx_get_scan(struct net_device *dev,
7792 return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra); 7748 return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
7793} 7749}
7794 7750
7795
7796/* 7751/*
7797 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c 7752 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7798 */ 7753 */
@@ -7821,8 +7776,8 @@ static int ipw2100_wx_get_encode(struct net_device *dev,
7821} 7776}
7822 7777
7823static int ipw2100_wx_set_power(struct net_device *dev, 7778static int ipw2100_wx_set_power(struct net_device *dev,
7824 struct iw_request_info *info, 7779 struct iw_request_info *info,
7825 union iwreq_data *wrqu, char *extra) 7780 union iwreq_data *wrqu, char *extra)
7826{ 7781{
7827 struct ipw2100_priv *priv = ieee80211_priv(dev); 7782 struct ipw2100_priv *priv = ieee80211_priv(dev);
7828 int err = 0; 7783 int err = 0;
@@ -7841,11 +7796,11 @@ static int ipw2100_wx_set_power(struct net_device *dev,
7841 } 7796 }
7842 7797
7843 switch (wrqu->power.flags & IW_POWER_MODE) { 7798 switch (wrqu->power.flags & IW_POWER_MODE) {
7844 case IW_POWER_ON: /* If not specified */ 7799 case IW_POWER_ON: /* If not specified */
7845 case IW_POWER_MODE: /* If set all mask */ 7800 case IW_POWER_MODE: /* If set all mask */
7846 case IW_POWER_ALL_R: /* If explicitely state all */ 7801 case IW_POWER_ALL_R: /* If explicitely state all */
7847 break; 7802 break;
7848 default: /* Otherwise we don't support it */ 7803 default: /* Otherwise we don't support it */
7849 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n", 7804 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7850 wrqu->power.flags); 7805 wrqu->power.flags);
7851 err = -EOPNOTSUPP; 7806 err = -EOPNOTSUPP;
@@ -7857,18 +7812,17 @@ static int ipw2100_wx_set_power(struct net_device *dev,
7857 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode; 7812 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7858 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); 7813 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7859 7814
7860 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", 7815 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7861 priv->power_mode);
7862 7816
7863 done: 7817 done:
7864 up(&priv->action_sem); 7818 up(&priv->action_sem);
7865 return err; 7819 return err;
7866 7820
7867} 7821}
7868 7822
7869static int ipw2100_wx_get_power(struct net_device *dev, 7823static int ipw2100_wx_get_power(struct net_device *dev,
7870 struct iw_request_info *info, 7824 struct iw_request_info *info,
7871 union iwreq_data *wrqu, char *extra) 7825 union iwreq_data *wrqu, char *extra)
7872{ 7826{
7873 /* 7827 /*
7874 * This can be called at any time. No action lock required 7828 * This can be called at any time. No action lock required
@@ -7876,9 +7830,9 @@ static int ipw2100_wx_get_power(struct net_device *dev,
7876 7830
7877 struct ipw2100_priv *priv = ieee80211_priv(dev); 7831 struct ipw2100_priv *priv = ieee80211_priv(dev);
7878 7832
7879 if (!(priv->power_mode & IPW_POWER_ENABLED)) { 7833 if (!(priv->power_mode & IPW_POWER_ENABLED))
7880 wrqu->power.disabled = 1; 7834 wrqu->power.disabled = 1;
7881 } else { 7835 else {
7882 wrqu->power.disabled = 0; 7836 wrqu->power.disabled = 0;
7883 wrqu->power.flags = 0; 7837 wrqu->power.flags = 0;
7884 } 7838 }
@@ -7888,6 +7842,269 @@ static int ipw2100_wx_get_power(struct net_device *dev,
7888 return 0; 7842 return 0;
7889} 7843}
7890 7844
7845#if WIRELESS_EXT > 17
7846/*
7847 * WE-18 WPA support
7848 */
7849
7850/* SIOCSIWGENIE */
7851static int ipw2100_wx_set_genie(struct net_device *dev,
7852 struct iw_request_info *info,
7853 union iwreq_data *wrqu, char *extra)
7854{
7855
7856 struct ipw2100_priv *priv = ieee80211_priv(dev);
7857 struct ieee80211_device *ieee = priv->ieee;
7858 u8 *buf;
7859
7860 if (!ieee->wpa_enabled)
7861 return -EOPNOTSUPP;
7862
7863 if (wrqu->data.length > MAX_WPA_IE_LEN ||
7864 (wrqu->data.length && extra == NULL))
7865 return -EINVAL;
7866
7867 if (wrqu->data.length) {
7868 buf = kmalloc(wrqu->data.length, GFP_KERNEL);
7869 if (buf == NULL)
7870 return -ENOMEM;
7871
7872 memcpy(buf, extra, wrqu->data.length);
7873 kfree(ieee->wpa_ie);
7874 ieee->wpa_ie = buf;
7875 ieee->wpa_ie_len = wrqu->data.length;
7876 } else {
7877 kfree(ieee->wpa_ie);
7878 ieee->wpa_ie = NULL;
7879 ieee->wpa_ie_len = 0;
7880 }
7881
7882 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7883
7884 return 0;
7885}
7886
7887/* SIOCGIWGENIE */
7888static int ipw2100_wx_get_genie(struct net_device *dev,
7889 struct iw_request_info *info,
7890 union iwreq_data *wrqu, char *extra)
7891{
7892 struct ipw2100_priv *priv = ieee80211_priv(dev);
7893 struct ieee80211_device *ieee = priv->ieee;
7894
7895 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7896 wrqu->data.length = 0;
7897 return 0;
7898 }
7899
7900 if (wrqu->data.length < ieee->wpa_ie_len)
7901 return -E2BIG;
7902
7903 wrqu->data.length = ieee->wpa_ie_len;
7904 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7905
7906 return 0;
7907}
7908
7909/* SIOCSIWAUTH */
7910static int ipw2100_wx_set_auth(struct net_device *dev,
7911 struct iw_request_info *info,
7912 union iwreq_data *wrqu, char *extra)
7913{
7914 struct ipw2100_priv *priv = ieee80211_priv(dev);
7915 struct ieee80211_device *ieee = priv->ieee;
7916 struct iw_param *param = &wrqu->param;
7917 struct ieee80211_crypt_data *crypt;
7918 unsigned long flags;
7919 int ret = 0;
7920
7921 switch (param->flags & IW_AUTH_INDEX) {
7922 case IW_AUTH_WPA_VERSION:
7923 case IW_AUTH_CIPHER_PAIRWISE:
7924 case IW_AUTH_CIPHER_GROUP:
7925 case IW_AUTH_KEY_MGMT:
7926 /*
7927 * ipw2200 does not use these parameters
7928 */
7929 break;
7930
7931 case IW_AUTH_TKIP_COUNTERMEASURES:
7932 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
7933 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7934 break;
7935
7936 flags = crypt->ops->get_flags(crypt->priv);
7937
7938 if (param->value)
7939 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7940 else
7941 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7942
7943 crypt->ops->set_flags(flags, crypt->priv);
7944
7945 break;
7946
7947 case IW_AUTH_DROP_UNENCRYPTED:{
7948 /* HACK:
7949 *
7950 * wpa_supplicant calls set_wpa_enabled when the driver
7951 * is loaded and unloaded, regardless of if WPA is being
7952 * used. No other calls are made which can be used to
7953 * determine if encryption will be used or not prior to
7954 * association being expected. If encryption is not being
7955 * used, drop_unencrypted is set to false, else true -- we
7956 * can use this to determine if the CAP_PRIVACY_ON bit should
7957 * be set.
7958 */
7959 struct ieee80211_security sec = {
7960 .flags = SEC_ENABLED,
7961 .enabled = param->value,
7962 };
7963 priv->ieee->drop_unencrypted = param->value;
7964 /* We only change SEC_LEVEL for open mode. Others
7965 * are set by ipw_wpa_set_encryption.
7966 */
7967 if (!param->value) {
7968 sec.flags |= SEC_LEVEL;
7969 sec.level = SEC_LEVEL_0;
7970 } else {
7971 sec.flags |= SEC_LEVEL;
7972 sec.level = SEC_LEVEL_1;
7973 }
7974 if (priv->ieee->set_security)
7975 priv->ieee->set_security(priv->ieee->dev, &sec);
7976 break;
7977 }
7978
7979 case IW_AUTH_80211_AUTH_ALG:
7980 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7981 break;
7982
7983 case IW_AUTH_WPA_ENABLED:
7984 ret = ipw2100_wpa_enable(priv, param->value);
7985 break;
7986
7987 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7988 ieee->ieee802_1x = param->value;
7989 break;
7990
7991 //case IW_AUTH_ROAMING_CONTROL:
7992 case IW_AUTH_PRIVACY_INVOKED:
7993 ieee->privacy_invoked = param->value;
7994 break;
7995
7996 default:
7997 return -EOPNOTSUPP;
7998 }
7999 return ret;
8000}
8001
8002/* SIOCGIWAUTH */
8003static int ipw2100_wx_get_auth(struct net_device *dev,
8004 struct iw_request_info *info,
8005 union iwreq_data *wrqu, char *extra)
8006{
8007 struct ipw2100_priv *priv = ieee80211_priv(dev);
8008 struct ieee80211_device *ieee = priv->ieee;
8009 struct ieee80211_crypt_data *crypt;
8010 struct iw_param *param = &wrqu->param;
8011 int ret = 0;
8012
8013 switch (param->flags & IW_AUTH_INDEX) {
8014 case IW_AUTH_WPA_VERSION:
8015 case IW_AUTH_CIPHER_PAIRWISE:
8016 case IW_AUTH_CIPHER_GROUP:
8017 case IW_AUTH_KEY_MGMT:
8018 /*
8019 * wpa_supplicant will control these internally
8020 */
8021 ret = -EOPNOTSUPP;
8022 break;
8023
8024 case IW_AUTH_TKIP_COUNTERMEASURES:
8025 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
8026 if (!crypt || !crypt->ops->get_flags) {
8027 IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
8028 "crypt not set!\n");
8029 break;
8030 }
8031
8032 param->value = (crypt->ops->get_flags(crypt->priv) &
8033 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
8034
8035 break;
8036
8037 case IW_AUTH_DROP_UNENCRYPTED:
8038 param->value = ieee->drop_unencrypted;
8039 break;
8040
8041 case IW_AUTH_80211_AUTH_ALG:
8042 param->value = priv->ieee->sec.auth_mode;
8043 break;
8044
8045 case IW_AUTH_WPA_ENABLED:
8046 param->value = ieee->wpa_enabled;
8047 break;
8048
8049 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
8050 param->value = ieee->ieee802_1x;
8051 break;
8052
8053 case IW_AUTH_ROAMING_CONTROL:
8054 case IW_AUTH_PRIVACY_INVOKED:
8055 param->value = ieee->privacy_invoked;
8056 break;
8057
8058 default:
8059 return -EOPNOTSUPP;
8060 }
8061 return 0;
8062}
8063
8064/* SIOCSIWENCODEEXT */
8065static int ipw2100_wx_set_encodeext(struct net_device *dev,
8066 struct iw_request_info *info,
8067 union iwreq_data *wrqu, char *extra)
8068{
8069 struct ipw2100_priv *priv = ieee80211_priv(dev);
8070 return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
8071}
8072
8073/* SIOCGIWENCODEEXT */
8074static int ipw2100_wx_get_encodeext(struct net_device *dev,
8075 struct iw_request_info *info,
8076 union iwreq_data *wrqu, char *extra)
8077{
8078 struct ipw2100_priv *priv = ieee80211_priv(dev);
8079 return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
8080}
8081
8082/* SIOCSIWMLME */
8083static int ipw2100_wx_set_mlme(struct net_device *dev,
8084 struct iw_request_info *info,
8085 union iwreq_data *wrqu, char *extra)
8086{
8087 struct ipw2100_priv *priv = ieee80211_priv(dev);
8088 struct iw_mlme *mlme = (struct iw_mlme *)extra;
8089 u16 reason;
8090
8091 reason = cpu_to_le16(mlme->reason_code);
8092
8093 switch (mlme->cmd) {
8094 case IW_MLME_DEAUTH:
8095 // silently ignore
8096 break;
8097
8098 case IW_MLME_DISASSOC:
8099 ipw2100_disassociate_bssid(priv);
8100 break;
8101
8102 default:
8103 return -EOPNOTSUPP;
8104 }
8105 return 0;
8106}
8107#endif /* WIRELESS_EXT > 17 */
7891 8108
7892/* 8109/*
7893 * 8110 *
@@ -7921,7 +8138,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev,
7921 if (priv->ieee->iw_mode == IW_MODE_MONITOR) 8138 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7922 err = ipw2100_switch_mode(priv, priv->last_mode); 8139 err = ipw2100_switch_mode(priv, priv->last_mode);
7923 } 8140 }
7924 done: 8141 done:
7925 up(&priv->action_sem); 8142 up(&priv->action_sem);
7926 return err; 8143 return err;
7927} 8144}
@@ -7956,7 +8173,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev,
7956 8173
7957 if (priv->power_mode != mode) 8174 if (priv->power_mode != mode)
7958 err = ipw2100_set_power_mode(priv, mode); 8175 err = ipw2100_set_power_mode(priv, mode);
7959 done: 8176 done:
7960 up(&priv->action_sem); 8177 up(&priv->action_sem);
7961 return err; 8178 return err;
7962} 8179}
@@ -7984,8 +8201,8 @@ static int ipw2100_wx_get_powermode(struct net_device *dev,
7984 "Power save level: %d (None)", level); 8201 "Power save level: %d (None)", level);
7985 break; 8202 break;
7986 case IPW_POWER_AUTO: 8203 case IPW_POWER_AUTO:
7987 snprintf(extra, MAX_POWER_STRING, 8204 snprintf(extra, MAX_POWER_STRING,
7988 "Power save level: %d (Auto)", 0); 8205 "Power save level: %d (Auto)", 0);
7989 break; 8206 break;
7990 default: 8207 default:
7991 timeout = timeout_duration[level - 1] / 1000; 8208 timeout = timeout_duration[level - 1] / 1000;
@@ -8002,7 +8219,6 @@ static int ipw2100_wx_get_powermode(struct net_device *dev,
8002 return 0; 8219 return 0;
8003} 8220}
8004 8221
8005
8006static int ipw2100_wx_set_preamble(struct net_device *dev, 8222static int ipw2100_wx_set_preamble(struct net_device *dev,
8007 struct iw_request_info *info, 8223 struct iw_request_info *info,
8008 union iwreq_data *wrqu, char *extra) 8224 union iwreq_data *wrqu, char *extra)
@@ -8027,14 +8243,14 @@ static int ipw2100_wx_set_preamble(struct net_device *dev,
8027 8243
8028 err = ipw2100_system_config(priv, 0); 8244 err = ipw2100_system_config(priv, 0);
8029 8245
8030done: 8246 done:
8031 up(&priv->action_sem); 8247 up(&priv->action_sem);
8032 return err; 8248 return err;
8033} 8249}
8034 8250
8035static int ipw2100_wx_get_preamble(struct net_device *dev, 8251static int ipw2100_wx_get_preamble(struct net_device *dev,
8036 struct iw_request_info *info, 8252 struct iw_request_info *info,
8037 union iwreq_data *wrqu, char *extra) 8253 union iwreq_data *wrqu, char *extra)
8038{ 8254{
8039 /* 8255 /*
8040 * This can be called at any time. No action lock required 8256 * This can be called at any time. No action lock required
@@ -8050,54 +8266,116 @@ static int ipw2100_wx_get_preamble(struct net_device *dev,
8050 return 0; 8266 return 0;
8051} 8267}
8052 8268
8053static iw_handler ipw2100_wx_handlers[] = 8269#ifdef CONFIG_IPW2100_MONITOR
8054{ 8270static int ipw2100_wx_set_crc_check(struct net_device *dev,
8055 NULL, /* SIOCSIWCOMMIT */ 8271 struct iw_request_info *info,
8056 ipw2100_wx_get_name, /* SIOCGIWNAME */ 8272 union iwreq_data *wrqu, char *extra)
8057 NULL, /* SIOCSIWNWID */ 8273{
8058 NULL, /* SIOCGIWNWID */ 8274 struct ipw2100_priv *priv = ieee80211_priv(dev);
8059 ipw2100_wx_set_freq, /* SIOCSIWFREQ */ 8275 int err, mode = *(int *)extra;
8060 ipw2100_wx_get_freq, /* SIOCGIWFREQ */ 8276
8061 ipw2100_wx_set_mode, /* SIOCSIWMODE */ 8277 down(&priv->action_sem);
8062 ipw2100_wx_get_mode, /* SIOCGIWMODE */ 8278 if (!(priv->status & STATUS_INITIALIZED)) {
8063 NULL, /* SIOCSIWSENS */ 8279 err = -EIO;
8064 NULL, /* SIOCGIWSENS */ 8280 goto done;
8065 NULL, /* SIOCSIWRANGE */ 8281 }
8066 ipw2100_wx_get_range, /* SIOCGIWRANGE */ 8282
8067 NULL, /* SIOCSIWPRIV */ 8283 if (mode == 1)
8068 NULL, /* SIOCGIWPRIV */ 8284 priv->config |= CFG_CRC_CHECK;
8069 NULL, /* SIOCSIWSTATS */ 8285 else if (mode == 0)
8070 NULL, /* SIOCGIWSTATS */ 8286 priv->config &= ~CFG_CRC_CHECK;
8071 NULL, /* SIOCSIWSPY */ 8287 else {
8072 NULL, /* SIOCGIWSPY */ 8288 err = -EINVAL;
8073 NULL, /* SIOCGIWTHRSPY */ 8289 goto done;
8074 NULL, /* SIOCWIWTHRSPY */ 8290 }
8075 ipw2100_wx_set_wap, /* SIOCSIWAP */ 8291 err = 0;
8076 ipw2100_wx_get_wap, /* SIOCGIWAP */ 8292
8077 NULL, /* -- hole -- */ 8293 done:
8078 NULL, /* SIOCGIWAPLIST -- deprecated */ 8294 up(&priv->action_sem);
8079 ipw2100_wx_set_scan, /* SIOCSIWSCAN */ 8295 return err;
8080 ipw2100_wx_get_scan, /* SIOCGIWSCAN */ 8296}
8081 ipw2100_wx_set_essid, /* SIOCSIWESSID */ 8297
8082 ipw2100_wx_get_essid, /* SIOCGIWESSID */ 8298static int ipw2100_wx_get_crc_check(struct net_device *dev,
8083 ipw2100_wx_set_nick, /* SIOCSIWNICKN */ 8299 struct iw_request_info *info,
8084 ipw2100_wx_get_nick, /* SIOCGIWNICKN */ 8300 union iwreq_data *wrqu, char *extra)
8085 NULL, /* -- hole -- */ 8301{
8086 NULL, /* -- hole -- */ 8302 /*
8087 ipw2100_wx_set_rate, /* SIOCSIWRATE */ 8303 * This can be called at any time. No action lock required
8088 ipw2100_wx_get_rate, /* SIOCGIWRATE */ 8304 */
8089 ipw2100_wx_set_rts, /* SIOCSIWRTS */ 8305
8090 ipw2100_wx_get_rts, /* SIOCGIWRTS */ 8306 struct ipw2100_priv *priv = ieee80211_priv(dev);
8091 ipw2100_wx_set_frag, /* SIOCSIWFRAG */ 8307
8092 ipw2100_wx_get_frag, /* SIOCGIWFRAG */ 8308 if (priv->config & CFG_CRC_CHECK)
8093 ipw2100_wx_set_txpow, /* SIOCSIWTXPOW */ 8309 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
8094 ipw2100_wx_get_txpow, /* SIOCGIWTXPOW */ 8310 else
8095 ipw2100_wx_set_retry, /* SIOCSIWRETRY */ 8311 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
8096 ipw2100_wx_get_retry, /* SIOCGIWRETRY */ 8312
8097 ipw2100_wx_set_encode, /* SIOCSIWENCODE */ 8313 return 0;
8098 ipw2100_wx_get_encode, /* SIOCGIWENCODE */ 8314}
8099 ipw2100_wx_set_power, /* SIOCSIWPOWER */ 8315#endif /* CONFIG_IPW2100_MONITOR */
8100 ipw2100_wx_get_power, /* SIOCGIWPOWER */ 8316
8317static iw_handler ipw2100_wx_handlers[] = {
8318 NULL, /* SIOCSIWCOMMIT */
8319 ipw2100_wx_get_name, /* SIOCGIWNAME */
8320 NULL, /* SIOCSIWNWID */
8321 NULL, /* SIOCGIWNWID */
8322 ipw2100_wx_set_freq, /* SIOCSIWFREQ */
8323 ipw2100_wx_get_freq, /* SIOCGIWFREQ */
8324 ipw2100_wx_set_mode, /* SIOCSIWMODE */
8325 ipw2100_wx_get_mode, /* SIOCGIWMODE */
8326 NULL, /* SIOCSIWSENS */
8327 NULL, /* SIOCGIWSENS */
8328 NULL, /* SIOCSIWRANGE */
8329 ipw2100_wx_get_range, /* SIOCGIWRANGE */
8330 NULL, /* SIOCSIWPRIV */
8331 NULL, /* SIOCGIWPRIV */
8332 NULL, /* SIOCSIWSTATS */
8333 NULL, /* SIOCGIWSTATS */
8334 NULL, /* SIOCSIWSPY */
8335 NULL, /* SIOCGIWSPY */
8336 NULL, /* SIOCGIWTHRSPY */
8337 NULL, /* SIOCWIWTHRSPY */
8338 ipw2100_wx_set_wap, /* SIOCSIWAP */
8339 ipw2100_wx_get_wap, /* SIOCGIWAP */
8340#if WIRELESS_EXT > 17
8341 ipw2100_wx_set_mlme, /* SIOCSIWMLME */
8342#else
8343 NULL, /* -- hole -- */
8344#endif
8345 NULL, /* SIOCGIWAPLIST -- deprecated */
8346 ipw2100_wx_set_scan, /* SIOCSIWSCAN */
8347 ipw2100_wx_get_scan, /* SIOCGIWSCAN */
8348 ipw2100_wx_set_essid, /* SIOCSIWESSID */
8349 ipw2100_wx_get_essid, /* SIOCGIWESSID */
8350 ipw2100_wx_set_nick, /* SIOCSIWNICKN */
8351 ipw2100_wx_get_nick, /* SIOCGIWNICKN */
8352 NULL, /* -- hole -- */
8353 NULL, /* -- hole -- */
8354 ipw2100_wx_set_rate, /* SIOCSIWRATE */
8355 ipw2100_wx_get_rate, /* SIOCGIWRATE */
8356 ipw2100_wx_set_rts, /* SIOCSIWRTS */
8357 ipw2100_wx_get_rts, /* SIOCGIWRTS */
8358 ipw2100_wx_set_frag, /* SIOCSIWFRAG */
8359 ipw2100_wx_get_frag, /* SIOCGIWFRAG */
8360 ipw2100_wx_set_txpow, /* SIOCSIWTXPOW */
8361 ipw2100_wx_get_txpow, /* SIOCGIWTXPOW */
8362 ipw2100_wx_set_retry, /* SIOCSIWRETRY */
8363 ipw2100_wx_get_retry, /* SIOCGIWRETRY */
8364 ipw2100_wx_set_encode, /* SIOCSIWENCODE */
8365 ipw2100_wx_get_encode, /* SIOCGIWENCODE */
8366 ipw2100_wx_set_power, /* SIOCSIWPOWER */
8367 ipw2100_wx_get_power, /* SIOCGIWPOWER */
8368#if WIRELESS_EXT > 17
8369 NULL, /* -- hole -- */
8370 NULL, /* -- hole -- */
8371 ipw2100_wx_set_genie, /* SIOCSIWGENIE */
8372 ipw2100_wx_get_genie, /* SIOCGIWGENIE */
8373 ipw2100_wx_set_auth, /* SIOCSIWAUTH */
8374 ipw2100_wx_get_auth, /* SIOCGIWAUTH */
8375 ipw2100_wx_set_encodeext, /* SIOCSIWENCODEEXT */
8376 ipw2100_wx_get_encodeext, /* SIOCGIWENCODEEXT */
8377 NULL, /* SIOCSIWPMKSA */
8378#endif
8101}; 8379};
8102 8380
8103#define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV 8381#define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
@@ -8106,60 +8384,71 @@ static iw_handler ipw2100_wx_handlers[] =
8106#define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3 8384#define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8107#define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4 8385#define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8108#define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5 8386#define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8387#define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8388#define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8109 8389
8110static const struct iw_priv_args ipw2100_private_args[] = { 8390static const struct iw_priv_args ipw2100_private_args[] = {
8111 8391
8112#ifdef CONFIG_IPW2100_MONITOR 8392#ifdef CONFIG_IPW2100_MONITOR
8113 { 8393 {
8114 IPW2100_PRIV_SET_MONITOR, 8394 IPW2100_PRIV_SET_MONITOR,
8115 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor" 8395 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
8116 },
8117 { 8396 {
8118 IPW2100_PRIV_RESET, 8397 IPW2100_PRIV_RESET,
8119 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset" 8398 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
8120 }, 8399#endif /* CONFIG_IPW2100_MONITOR */
8121#endif /* CONFIG_IPW2100_MONITOR */
8122 8400
8123 { 8401 {
8124 IPW2100_PRIV_SET_POWER, 8402 IPW2100_PRIV_SET_POWER,
8125 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power" 8403 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
8126 },
8127 { 8404 {
8128 IPW2100_PRIV_GET_POWER, 8405 IPW2100_PRIV_GET_POWER,
8129 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING, "get_power" 8406 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
8130 }, 8407 "get_power"},
8131 { 8408 {
8132 IPW2100_PRIV_SET_LONGPREAMBLE, 8409 IPW2100_PRIV_SET_LONGPREAMBLE,
8133 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble" 8410 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
8134 },
8135 { 8411 {
8136 IPW2100_PRIV_GET_LONGPREAMBLE, 8412 IPW2100_PRIV_GET_LONGPREAMBLE,
8137 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble" 8413 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
8138 }, 8414#ifdef CONFIG_IPW2100_MONITOR
8415 {
8416 IPW2100_PRIV_SET_CRC_CHECK,
8417 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8418 {
8419 IPW2100_PRIV_GET_CRC_CHECK,
8420 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8421#endif /* CONFIG_IPW2100_MONITOR */
8139}; 8422};
8140 8423
8141static iw_handler ipw2100_private_handler[] = { 8424static iw_handler ipw2100_private_handler[] = {
8142#ifdef CONFIG_IPW2100_MONITOR 8425#ifdef CONFIG_IPW2100_MONITOR
8143 ipw2100_wx_set_promisc, 8426 ipw2100_wx_set_promisc,
8144 ipw2100_wx_reset, 8427 ipw2100_wx_reset,
8145#else /* CONFIG_IPW2100_MONITOR */ 8428#else /* CONFIG_IPW2100_MONITOR */
8146 NULL, 8429 NULL,
8147 NULL, 8430 NULL,
8148#endif /* CONFIG_IPW2100_MONITOR */ 8431#endif /* CONFIG_IPW2100_MONITOR */
8149 ipw2100_wx_set_powermode, 8432 ipw2100_wx_set_powermode,
8150 ipw2100_wx_get_powermode, 8433 ipw2100_wx_get_powermode,
8151 ipw2100_wx_set_preamble, 8434 ipw2100_wx_set_preamble,
8152 ipw2100_wx_get_preamble, 8435 ipw2100_wx_get_preamble,
8436#ifdef CONFIG_IPW2100_MONITOR
8437 ipw2100_wx_set_crc_check,
8438 ipw2100_wx_get_crc_check,
8439#else /* CONFIG_IPW2100_MONITOR */
8440 NULL,
8441 NULL,
8442#endif /* CONFIG_IPW2100_MONITOR */
8153}; 8443};
8154 8444
8155static struct iw_handler_def ipw2100_wx_handler_def = 8445static struct iw_handler_def ipw2100_wx_handler_def = {
8156{
8157 .standard = ipw2100_wx_handlers, 8446 .standard = ipw2100_wx_handlers,
8158 .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler), 8447 .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler),
8159 .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler), 8448 .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler),
8160 .num_private_args = sizeof(ipw2100_private_args) / 8449 .num_private_args = sizeof(ipw2100_private_args) /
8161 sizeof(struct iw_priv_args), 8450 sizeof(struct iw_priv_args),
8162 .private = (iw_handler *)ipw2100_private_handler, 8451 .private = (iw_handler *) ipw2100_private_handler,
8163 .private_args = (struct iw_priv_args *)ipw2100_private_args, 8452 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8164}; 8453};
8165 8454
@@ -8168,7 +8457,7 @@ static struct iw_handler_def ipw2100_wx_handler_def =
8168 * Called by /proc/net/wireless 8457 * Called by /proc/net/wireless
8169 * Also called by SIOCGIWSTATS 8458 * Also called by SIOCGIWSTATS
8170 */ 8459 */
8171static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev) 8460static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8172{ 8461{
8173 enum { 8462 enum {
8174 POOR = 30, 8463 POOR = 30,
@@ -8188,7 +8477,7 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8188 u32 ord_len = sizeof(u32); 8477 u32 ord_len = sizeof(u32);
8189 8478
8190 if (!priv) 8479 if (!priv)
8191 return (struct iw_statistics *) NULL; 8480 return (struct iw_statistics *)NULL;
8192 8481
8193 wstats = &priv->wstats; 8482 wstats = &priv->wstats;
8194 8483
@@ -8205,7 +8494,7 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8205 wstats->qual.noise = 0; 8494 wstats->qual.noise = 0;
8206 wstats->qual.updated = 7; 8495 wstats->qual.updated = 7;
8207 wstats->qual.updated |= IW_QUAL_NOISE_INVALID | 8496 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8208 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID; 8497 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8209 return wstats; 8498 return wstats;
8210 } 8499 }
8211 8500
@@ -8213,7 +8502,7 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8213 &missed_beacons, &ord_len)) 8502 &missed_beacons, &ord_len))
8214 goto fail_get_ordinal; 8503 goto fail_get_ordinal;
8215 8504
8216 /* If we don't have a connection the quality and level is 0*/ 8505 /* If we don't have a connection the quality and level is 0 */
8217 if (!(priv->status & STATUS_ASSOCIATED)) { 8506 if (!(priv->status & STATUS_ASSOCIATED)) {
8218 wstats->qual.qual = 0; 8507 wstats->qual.qual = 0;
8219 wstats->qual.level = 0; 8508 wstats->qual.level = 0;
@@ -8230,10 +8519,10 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8230 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR; 8519 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8231 else if (rssi < 30) 8520 else if (rssi < 30)
8232 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) / 8521 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8233 10 + GOOD; 8522 10 + GOOD;
8234 else 8523 else
8235 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) / 8524 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8236 10 + VERY_GOOD; 8525 10 + VERY_GOOD;
8237 8526
8238 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES, 8527 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8239 &tx_retries, &ord_len)) 8528 &tx_retries, &ord_len))
@@ -8247,25 +8536,25 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8247 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR; 8536 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8248 else if (tx_retries > 50) 8537 else if (tx_retries > 50)
8249 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) / 8538 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8250 15 + GOOD; 8539 15 + GOOD;
8251 else 8540 else
8252 tx_qual = (50 - tx_retries) * 8541 tx_qual = (50 - tx_retries) *
8253 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD; 8542 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8254 8543
8255 if (missed_beacons > 50) 8544 if (missed_beacons > 50)
8256 beacon_qual = (60 - missed_beacons) * POOR / 10; 8545 beacon_qual = (60 - missed_beacons) * POOR / 10;
8257 else if (missed_beacons > 40) 8546 else if (missed_beacons > 40)
8258 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) / 8547 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8259 10 + POOR; 8548 10 + POOR;
8260 else if (missed_beacons > 32) 8549 else if (missed_beacons > 32)
8261 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) / 8550 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8262 18 + FAIR; 8551 18 + FAIR;
8263 else if (missed_beacons > 20) 8552 else if (missed_beacons > 20)
8264 beacon_qual = (32 - missed_beacons) * 8553 beacon_qual = (32 - missed_beacons) *
8265 (VERY_GOOD - GOOD) / 20 + GOOD; 8554 (VERY_GOOD - GOOD) / 20 + GOOD;
8266 else 8555 else
8267 beacon_qual = (20 - missed_beacons) * 8556 beacon_qual = (20 - missed_beacons) *
8268 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD; 8557 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8269 8558
8270 quality = min(beacon_qual, min(tx_qual, rssi_qual)); 8559 quality = min(beacon_qual, min(tx_qual, rssi_qual));
8271 8560
@@ -8288,7 +8577,7 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8288 wstats->qual.updated = 7; 8577 wstats->qual.updated = 7;
8289 wstats->qual.updated |= IW_QUAL_NOISE_INVALID; 8578 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8290 8579
8291 /* FIXME: this is percent and not a # */ 8580 /* FIXME: this is percent and not a # */
8292 wstats->miss.beacon = missed_beacons; 8581 wstats->miss.beacon = missed_beacons;
8293 8582
8294 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES, 8583 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
@@ -8298,10 +8587,10 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device * dev)
8298 8587
8299 return wstats; 8588 return wstats;
8300 8589
8301 fail_get_ordinal: 8590 fail_get_ordinal:
8302 IPW_DEBUG_WX("failed querying ordinals.\n"); 8591 IPW_DEBUG_WX("failed querying ordinals.\n");
8303 8592
8304 return (struct iw_statistics *) NULL; 8593 return (struct iw_statistics *)NULL;
8305} 8594}
8306 8595
8307static void ipw2100_wx_event_work(struct ipw2100_priv *priv) 8596static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
@@ -8324,23 +8613,17 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8324 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) || 8613 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8325 priv->status & STATUS_RF_KILL_MASK || 8614 priv->status & STATUS_RF_KILL_MASK ||
8326 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, 8615 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8327 &priv->bssid, &len)) { 8616 &priv->bssid, &len)) {
8328 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 8617 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
8329 } else { 8618 } else {
8330 /* We now have the BSSID, so can finish setting to the full 8619 /* We now have the BSSID, so can finish setting to the full
8331 * associated state */ 8620 * associated state */
8332 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); 8621 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8333 memcpy(&priv->ieee->bssid, priv->bssid, ETH_ALEN); 8622 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8334 priv->status &= ~STATUS_ASSOCIATING; 8623 priv->status &= ~STATUS_ASSOCIATING;
8335 priv->status |= STATUS_ASSOCIATED; 8624 priv->status |= STATUS_ASSOCIATED;
8336 netif_carrier_on(priv->net_dev); 8625 netif_carrier_on(priv->net_dev);
8337 if (netif_queue_stopped(priv->net_dev)) { 8626 netif_wake_queue(priv->net_dev);
8338 IPW_DEBUG_INFO("Waking net queue.\n");
8339 netif_wake_queue(priv->net_dev);
8340 } else {
8341 IPW_DEBUG_INFO("Starting net queue.\n");
8342 netif_start_queue(priv->net_dev);
8343 }
8344 } 8627 }
8345 8628
8346 if (!(priv->status & STATUS_ASSOCIATED)) { 8629 if (!(priv->status & STATUS_ASSOCIATED)) {
@@ -8349,7 +8632,8 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8349 /* This is a disassociation event, so kick the firmware to 8632 /* This is a disassociation event, so kick the firmware to
8350 * look for another AP */ 8633 * look for another AP */
8351 if (priv->config & CFG_STATIC_ESSID) 8634 if (priv->config & CFG_STATIC_ESSID)
8352 ipw2100_set_essid(priv, priv->essid, priv->essid_len, 0); 8635 ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8636 0);
8353 else 8637 else
8354 ipw2100_set_essid(priv, NULL, 0, 0); 8638 ipw2100_set_essid(priv, NULL, 0, 0);
8355 up(&priv->action_sem); 8639 up(&priv->action_sem);
@@ -8372,7 +8656,6 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8372 8656
8373#define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw" 8657#define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8374 8658
8375
8376/* 8659/*
8377 8660
8378BINARY FIRMWARE HEADER FORMAT 8661BINARY FIRMWARE HEADER FORMAT
@@ -8394,12 +8677,10 @@ struct ipw2100_fw_header {
8394 unsigned int uc_size; 8677 unsigned int uc_size;
8395} __attribute__ ((packed)); 8678} __attribute__ ((packed));
8396 8679
8397
8398
8399static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw) 8680static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8400{ 8681{
8401 struct ipw2100_fw_header *h = 8682 struct ipw2100_fw_header *h =
8402 (struct ipw2100_fw_header *)fw->fw_entry->data; 8683 (struct ipw2100_fw_header *)fw->fw_entry->data;
8403 8684
8404 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) { 8685 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8405 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible " 8686 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
@@ -8418,7 +8699,6 @@ static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8418 return 0; 8699 return 0;
8419} 8700}
8420 8701
8421
8422static int ipw2100_get_firmware(struct ipw2100_priv *priv, 8702static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8423 struct ipw2100_fw *fw) 8703 struct ipw2100_fw *fw)
8424{ 8704{
@@ -8426,7 +8706,7 @@ static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8426 int rc; 8706 int rc;
8427 8707
8428 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n", 8708 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8429 priv->net_dev->name); 8709 priv->net_dev->name);
8430 8710
8431 switch (priv->ieee->iw_mode) { 8711 switch (priv->ieee->iw_mode) {
8432 case IW_MODE_ADHOC: 8712 case IW_MODE_ADHOC:
@@ -8452,7 +8732,7 @@ static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8452 return rc; 8732 return rc;
8453 } 8733 }
8454 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data, 8734 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8455 fw->fw_entry->size); 8735 fw->fw_entry->size);
8456 8736
8457 ipw2100_mod_firmware_load(fw); 8737 ipw2100_mod_firmware_load(fw);
8458 8738
@@ -8468,7 +8748,6 @@ static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8468 fw->fw_entry = NULL; 8748 fw->fw_entry = NULL;
8469} 8749}
8470 8750
8471
8472static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf, 8751static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8473 size_t max) 8752 size_t max)
8474{ 8753{
@@ -8477,8 +8756,7 @@ static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8477 u32 tmp; 8756 u32 tmp;
8478 int i; 8757 int i;
8479 /* firmware version is an ascii string (max len of 14) */ 8758 /* firmware version is an ascii string (max len of 14) */
8480 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, 8759 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8481 ver, &len))
8482 return -EIO; 8760 return -EIO;
8483 tmp = max; 8761 tmp = max;
8484 if (len >= max) 8762 if (len >= max)
@@ -8495,8 +8773,7 @@ static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8495 u32 ver; 8773 u32 ver;
8496 u32 len = sizeof(ver); 8774 u32 len = sizeof(ver);
8497 /* microcode version is a 32 bit integer */ 8775 /* microcode version is a 32 bit integer */
8498 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, 8776 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8499 &ver, &len))
8500 return -EIO; 8777 return -EIO;
8501 return snprintf(buf, max, "%08X", ver); 8778 return snprintf(buf, max, "%08X", ver);
8502} 8779}
@@ -8504,8 +8781,7 @@ static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8504/* 8781/*
8505 * On exit, the firmware will have been freed from the fw list 8782 * On exit, the firmware will have been freed from the fw list
8506 */ 8783 */
8507static int ipw2100_fw_download(struct ipw2100_priv *priv, 8784static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8508 struct ipw2100_fw *fw)
8509{ 8785{
8510 /* firmware is constructed of N contiguous entries, each entry is 8786 /* firmware is constructed of N contiguous entries, each entry is
8511 * structured as: 8787 * structured as:
@@ -8513,7 +8789,7 @@ static int ipw2100_fw_download(struct ipw2100_priv *priv,
8513 * offset sie desc 8789 * offset sie desc
8514 * 0 4 address to write to 8790 * 0 4 address to write to
8515 * 4 2 length of data run 8791 * 4 2 length of data run
8516 * 6 length data 8792 * 6 length data
8517 */ 8793 */
8518 unsigned int addr; 8794 unsigned int addr;
8519 unsigned short len; 8795 unsigned short len;
@@ -8522,12 +8798,12 @@ static int ipw2100_fw_download(struct ipw2100_priv *priv,
8522 unsigned int firmware_data_left = fw->fw.size; 8798 unsigned int firmware_data_left = fw->fw.size;
8523 8799
8524 while (firmware_data_left > 0) { 8800 while (firmware_data_left > 0) {
8525 addr = *(u32 *)(firmware_data); 8801 addr = *(u32 *) (firmware_data);
8526 firmware_data += 4; 8802 firmware_data += 4;
8527 firmware_data_left -= 4; 8803 firmware_data_left -= 4;
8528 8804
8529 len = *(u16 *)(firmware_data); 8805 len = *(u16 *) (firmware_data);
8530 firmware_data += 2; 8806 firmware_data += 2;
8531 firmware_data_left -= 2; 8807 firmware_data_left -= 2;
8532 8808
8533 if (len > 32) { 8809 if (len > 32) {
@@ -8538,7 +8814,7 @@ static int ipw2100_fw_download(struct ipw2100_priv *priv,
8538 } 8814 }
8539 8815
8540 write_nic_memory(priv->net_dev, addr, len, firmware_data); 8816 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8541 firmware_data += len; 8817 firmware_data += len;
8542 firmware_data_left -= len; 8818 firmware_data_left -= len;
8543 } 8819 }
8544 8820
@@ -8652,21 +8928,19 @@ static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8652 for (i = 0; i < 30; i++) { 8928 for (i = 0; i < 30; i++) {
8653 /* Read alive response structure */ 8929 /* Read alive response structure */
8654 for (j = 0; 8930 for (j = 0;
8655 j < (sizeof(struct symbol_alive_response) >> 1); 8931 j < (sizeof(struct symbol_alive_response) >> 1); j++)
8656 j++) 8932 read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8657 read_nic_word(dev, 0x210004,
8658 ((u16 *)&response) + j);
8659 8933
8660 if ((response.cmd_id == 1) && 8934 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8661 (response.ucode_valid == 0x1))
8662 break; 8935 break;
8663 udelay(10); 8936 udelay(10);
8664 } 8937 }
8665 8938
8666 if (i == 30) { 8939 if (i == 30) {
8667 printk(KERN_ERR DRV_NAME ": %s: No response from Symbol - hw not alive\n", 8940 printk(KERN_ERR DRV_NAME
8941 ": %s: No response from Symbol - hw not alive\n",
8668 dev->name); 8942 dev->name);
8669 printk_buf(IPW_DL_ERROR, (u8*)&response, sizeof(response)); 8943 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));
8670 return -EIO; 8944 return -EIO;
8671 } 8945 }
8672 8946
diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h
index c9e99ce15d66..a1a9cbcf6c2f 100644
--- a/drivers/net/wireless/ipw2100.h
+++ b/drivers/net/wireless/ipw2100.h
@@ -1,6 +1,6 @@
1/****************************************************************************** 1/******************************************************************************
2 2
3 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. 3 Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
4 4
5 This program is free software; you can redistribute it and/or modify it 5 This program is free software; you can redistribute it and/or modify it
6 under the terms of version 2 of the GNU General Public License as 6 under the terms of version 2 of the GNU General Public License as
@@ -93,7 +93,6 @@ struct ipw2100_rx_packet;
93#define IPW_DL_IOCTL (1<<14) 93#define IPW_DL_IOCTL (1<<14)
94#define IPW_DL_RF_KILL (1<<17) 94#define IPW_DL_RF_KILL (1<<17)
95 95
96
97#define IPW_DL_MANAGE (1<<15) 96#define IPW_DL_MANAGE (1<<15)
98#define IPW_DL_FW (1<<16) 97#define IPW_DL_FW (1<<16)
99 98
@@ -156,7 +155,9 @@ extern const char *band_str[];
156 155
157struct bd_status { 156struct bd_status {
158 union { 157 union {
159 struct { u8 nlf:1, txType:2, intEnabled:1, reserved:4;} fields; 158 struct {
159 u8 nlf:1, txType:2, intEnabled:1, reserved:4;
160 } fields;
160 u8 field; 161 u8 field;
161 } info; 162 } info;
162} __attribute__ ((packed)); 163} __attribute__ ((packed));
@@ -165,7 +166,7 @@ struct ipw2100_bd {
165 u32 host_addr; 166 u32 host_addr;
166 u32 buf_length; 167 u32 buf_length;
167 struct bd_status status; 168 struct bd_status status;
168 /* number of fragments for frame (should be set only for 169 /* number of fragments for frame (should be set only for
169 * 1st TBD) */ 170 * 1st TBD) */
170 u8 num_fragments; 171 u8 num_fragments;
171 u8 reserved[6]; 172 u8 reserved[6];
@@ -293,10 +294,10 @@ struct ipw2100_cmd_header {
293struct ipw2100_data_header { 294struct ipw2100_data_header {
294 u32 host_command_reg; 295 u32 host_command_reg;
295 u32 host_command_reg1; 296 u32 host_command_reg1;
296 u8 encrypted; // BOOLEAN in win! TRUE if frame is enc by driver 297 u8 encrypted; // BOOLEAN in win! TRUE if frame is enc by driver
297 u8 needs_encryption; // BOOLEAN in win! TRUE if frma need to be enc in NIC 298 u8 needs_encryption; // BOOLEAN in win! TRUE if frma need to be enc in NIC
298 u8 wep_index; // 0 no key, 1-4 key index, 0xff immediate key 299 u8 wep_index; // 0 no key, 1-4 key index, 0xff immediate key
299 u8 key_size; // 0 no imm key, 0x5 64bit encr, 0xd 128bit encr, 0x10 128bit encr and 128bit IV 300 u8 key_size; // 0 no imm key, 0x5 64bit encr, 0xd 128bit encr, 0x10 128bit encr and 128bit IV
300 u8 key[16]; 301 u8 key[16];
301 u8 reserved[10]; // f/w reserved 302 u8 reserved[10]; // f/w reserved
302 u8 src_addr[ETH_ALEN]; 303 u8 src_addr[ETH_ALEN];
@@ -306,14 +307,13 @@ struct ipw2100_data_header {
306 307
307/* Host command data structure */ 308/* Host command data structure */
308struct host_command { 309struct host_command {
309 u32 host_command; // COMMAND ID 310 u32 host_command; // COMMAND ID
310 u32 host_command1; // COMMAND ID 311 u32 host_command1; // COMMAND ID
311 u32 host_command_sequence; // UNIQUE COMMAND NUMBER (ID) 312 u32 host_command_sequence; // UNIQUE COMMAND NUMBER (ID)
312 u32 host_command_length; // LENGTH 313 u32 host_command_length; // LENGTH
313 u32 host_command_parameters[HOST_COMMAND_PARAMS_REG_LEN]; // COMMAND PARAMETERS 314 u32 host_command_parameters[HOST_COMMAND_PARAMS_REG_LEN]; // COMMAND PARAMETERS
314} __attribute__ ((packed)); 315} __attribute__ ((packed));
315 316
316
317typedef enum { 317typedef enum {
318 POWER_ON_RESET, 318 POWER_ON_RESET,
319 EXIT_POWER_DOWN_RESET, 319 EXIT_POWER_DOWN_RESET,
@@ -328,17 +328,16 @@ enum {
328 RX 328 RX
329}; 329};
330 330
331
332struct ipw2100_tx_packet { 331struct ipw2100_tx_packet {
333 int type; 332 int type;
334 int index; 333 int index;
335 union { 334 union {
336 struct { /* COMMAND */ 335 struct { /* COMMAND */
337 struct ipw2100_cmd_header* cmd; 336 struct ipw2100_cmd_header *cmd;
338 dma_addr_t cmd_phys; 337 dma_addr_t cmd_phys;
339 } c_struct; 338 } c_struct;
340 struct { /* DATA */ 339 struct { /* DATA */
341 struct ipw2100_data_header* data; 340 struct ipw2100_data_header *data;
342 dma_addr_t data_phys; 341 dma_addr_t data_phys;
343 struct ieee80211_txb *txb; 342 struct ieee80211_txb *txb;
344 } d_struct; 343 } d_struct;
@@ -348,7 +347,6 @@ struct ipw2100_tx_packet {
348 struct list_head list; 347 struct list_head list;
349}; 348};
350 349
351
352struct ipw2100_rx_packet { 350struct ipw2100_rx_packet {
353 struct ipw2100_rx *rxp; 351 struct ipw2100_rx *rxp;
354 dma_addr_t dma_addr; 352 dma_addr_t dma_addr;
@@ -432,13 +430,13 @@ enum {
432}; 430};
433 431
434#define STATUS_POWERED (1<<0) 432#define STATUS_POWERED (1<<0)
435#define STATUS_CMD_ACTIVE (1<<1) /**< host command in progress */ 433#define STATUS_CMD_ACTIVE (1<<1) /**< host command in progress */
436#define STATUS_RUNNING (1<<2) /* Card initialized, but not enabled */ 434#define STATUS_RUNNING (1<<2) /* Card initialized, but not enabled */
437#define STATUS_ENABLED (1<<3) /* Card enabled -- can scan,Tx,Rx */ 435#define STATUS_ENABLED (1<<3) /* Card enabled -- can scan,Tx,Rx */
438#define STATUS_STOPPING (1<<4) /* Card is in shutdown phase */ 436#define STATUS_STOPPING (1<<4) /* Card is in shutdown phase */
439#define STATUS_INITIALIZED (1<<5) /* Card is ready for external calls */ 437#define STATUS_INITIALIZED (1<<5) /* Card is ready for external calls */
440#define STATUS_ASSOCIATING (1<<9) /* Associated, but no BSSID yet */ 438#define STATUS_ASSOCIATING (1<<9) /* Associated, but no BSSID yet */
441#define STATUS_ASSOCIATED (1<<10) /* Associated and BSSID valid */ 439#define STATUS_ASSOCIATED (1<<10) /* Associated and BSSID valid */
442#define STATUS_INT_ENABLED (1<<11) 440#define STATUS_INT_ENABLED (1<<11)
443#define STATUS_RF_KILL_HW (1<<12) 441#define STATUS_RF_KILL_HW (1<<12)
444#define STATUS_RF_KILL_SW (1<<13) 442#define STATUS_RF_KILL_SW (1<<13)
@@ -451,9 +449,7 @@ enum {
451#define STATUS_SCAN_COMPLETE (1<<26) 449#define STATUS_SCAN_COMPLETE (1<<26)
452#define STATUS_WX_EVENT_PENDING (1<<27) 450#define STATUS_WX_EVENT_PENDING (1<<27)
453#define STATUS_RESET_PENDING (1<<29) 451#define STATUS_RESET_PENDING (1<<29)
454#define STATUS_SECURITY_UPDATED (1<<30) /* Security sync needed */ 452#define STATUS_SECURITY_UPDATED (1<<30) /* Security sync needed */
455
456
457 453
458/* Internal NIC states */ 454/* Internal NIC states */
459#define IPW_STATE_INITIALIZED (1<<0) 455#define IPW_STATE_INITIALIZED (1<<0)
@@ -469,11 +465,9 @@ enum {
469#define IPW_STATE_POWER_DOWN (1<<10) 465#define IPW_STATE_POWER_DOWN (1<<10)
470#define IPW_STATE_SCANNING (1<<11) 466#define IPW_STATE_SCANNING (1<<11)
471 467
472 468#define CFG_STATIC_CHANNEL (1<<0) /* Restrict assoc. to single channel */
473 469#define CFG_STATIC_ESSID (1<<1) /* Restrict assoc. to single SSID */
474#define CFG_STATIC_CHANNEL (1<<0) /* Restrict assoc. to single channel */ 470#define CFG_STATIC_BSSID (1<<2) /* Restrict assoc. to single BSSID */
475#define CFG_STATIC_ESSID (1<<1) /* Restrict assoc. to single SSID */
476#define CFG_STATIC_BSSID (1<<2) /* Restrict assoc. to single BSSID */
477#define CFG_CUSTOM_MAC (1<<3) 471#define CFG_CUSTOM_MAC (1<<3)
478#define CFG_LONG_PREAMBLE (1<<4) 472#define CFG_LONG_PREAMBLE (1<<4)
479#define CFG_ASSOCIATE (1<<6) 473#define CFG_ASSOCIATE (1<<6)
@@ -481,14 +475,17 @@ enum {
481#define CFG_ADHOC_CREATE (1<<8) 475#define CFG_ADHOC_CREATE (1<<8)
482#define CFG_C3_DISABLED (1<<9) 476#define CFG_C3_DISABLED (1<<9)
483#define CFG_PASSIVE_SCAN (1<<10) 477#define CFG_PASSIVE_SCAN (1<<10)
478#ifdef CONFIG_IPW2100_MONITOR
479#define CFG_CRC_CHECK (1<<11)
480#endif
484 481
485#define CAP_SHARED_KEY (1<<0) /* Off = OPEN */ 482#define CAP_SHARED_KEY (1<<0) /* Off = OPEN */
486#define CAP_PRIVACY_ON (1<<1) /* Off = No privacy */ 483#define CAP_PRIVACY_ON (1<<1) /* Off = No privacy */
487 484
488struct ipw2100_priv { 485struct ipw2100_priv {
489 486
490 int stop_hang_check; /* Set 1 when shutting down to kill hang_check */ 487 int stop_hang_check; /* Set 1 when shutting down to kill hang_check */
491 int stop_rf_kill; /* Set 1 when shutting down to kill rf_kill */ 488 int stop_rf_kill; /* Set 1 when shutting down to kill rf_kill */
492 489
493 struct ieee80211_device *ieee; 490 struct ieee80211_device *ieee;
494 unsigned long status; 491 unsigned long status;
@@ -519,19 +516,16 @@ struct ipw2100_priv {
519 unsigned long hw_features; 516 unsigned long hw_features;
520 int hangs; 517 int hangs;
521 u32 last_rtc; 518 u32 last_rtc;
522 int dump_raw; /* 1 to dump raw bytes in /sys/.../memory */ 519 int dump_raw; /* 1 to dump raw bytes in /sys/.../memory */
523 u8* snapshot[0x30]; 520 u8 *snapshot[0x30];
524 521
525 u8 mandatory_bssid_mac[ETH_ALEN]; 522 u8 mandatory_bssid_mac[ETH_ALEN];
526 u8 mac_addr[ETH_ALEN]; 523 u8 mac_addr[ETH_ALEN];
527 524
528 int power_mode; 525 int power_mode;
529 526
530 /* WEP data */
531 struct ieee80211_security sec;
532 int messages_sent; 527 int messages_sent;
533 528
534
535 int short_retry_limit; 529 int short_retry_limit;
536 int long_retry_limit; 530 int long_retry_limit;
537 531
@@ -599,7 +593,6 @@ struct ipw2100_priv {
599 wait_queue_head_t wait_command_queue; 593 wait_queue_head_t wait_command_queue;
600}; 594};
601 595
602
603/********************************************************* 596/*********************************************************
604 * Host Command -> From Driver to FW 597 * Host Command -> From Driver to FW
605 *********************************************************/ 598 *********************************************************/
@@ -646,7 +639,6 @@ struct ipw2100_priv {
646#define CARD_DISABLE_PHY_OFF 61 639#define CARD_DISABLE_PHY_OFF 61
647#define MSDU_TX_RATES 62 640#define MSDU_TX_RATES 62
648 641
649
650/* Rogue AP Detection */ 642/* Rogue AP Detection */
651#define SET_STATION_STAT_BITS 64 643#define SET_STATION_STAT_BITS 64
652#define CLEAR_STATIONS_STAT_BITS 65 644#define CLEAR_STATIONS_STAT_BITS 65
@@ -655,8 +647,6 @@ struct ipw2100_priv {
655#define DISASSOCIATION_BSSID 68 647#define DISASSOCIATION_BSSID 68
656#define SET_WPA_IE 69 648#define SET_WPA_IE 69
657 649
658
659
660/* system configuration bit mask: */ 650/* system configuration bit mask: */
661#define IPW_CFG_MONITOR 0x00004 651#define IPW_CFG_MONITOR 0x00004
662#define IPW_CFG_PREAMBLE_AUTO 0x00010 652#define IPW_CFG_PREAMBLE_AUTO 0x00010
@@ -704,7 +694,7 @@ struct ipw2100_priv {
704#define IPW2100_INTA_TX_TRANSFER (0x00000001) // Bit 0 (LSB) 694#define IPW2100_INTA_TX_TRANSFER (0x00000001) // Bit 0 (LSB)
705#define IPW2100_INTA_RX_TRANSFER (0x00000002) // Bit 1 695#define IPW2100_INTA_RX_TRANSFER (0x00000002) // Bit 1
706#define IPW2100_INTA_TX_COMPLETE (0x00000004) // Bit 2 696#define IPW2100_INTA_TX_COMPLETE (0x00000004) // Bit 2
707#define IPW2100_INTA_EVENT_INTERRUPT (0x00000008) // Bit 3 697#define IPW2100_INTA_EVENT_INTERRUPT (0x00000008) // Bit 3
708#define IPW2100_INTA_STATUS_CHANGE (0x00000010) // Bit 4 698#define IPW2100_INTA_STATUS_CHANGE (0x00000010) // Bit 4
709#define IPW2100_INTA_BEACON_PERIOD_EXPIRED (0x00000020) // Bit 5 699#define IPW2100_INTA_BEACON_PERIOD_EXPIRED (0x00000020) // Bit 5
710#define IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE (0x00010000) // Bit 16 700#define IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE (0x00010000) // Bit 16
@@ -784,9 +774,6 @@ struct ipw2100_priv {
784#define IPW_CARD_DISABLE_PHY_OFF_COMPLETE_WAIT 100 // 100 milli 774#define IPW_CARD_DISABLE_PHY_OFF_COMPLETE_WAIT 100 // 100 milli
785#define IPW_PREPARE_POWER_DOWN_COMPLETE_WAIT 100 // 100 milli 775#define IPW_PREPARE_POWER_DOWN_COMPLETE_WAIT 100 // 100 milli
786 776
787
788
789
790#define IPW_HEADER_802_11_SIZE sizeof(struct ieee80211_hdr_3addr) 777#define IPW_HEADER_802_11_SIZE sizeof(struct ieee80211_hdr_3addr)
791#define IPW_MAX_80211_PAYLOAD_SIZE 2304U 778#define IPW_MAX_80211_PAYLOAD_SIZE 2304U
792#define IPW_MAX_802_11_PAYLOAD_LENGTH 2312 779#define IPW_MAX_802_11_PAYLOAD_LENGTH 2312
@@ -843,8 +830,8 @@ struct ipw2100_rx {
843#define IPW_TX_POWER_MIN_DBM (-12) 830#define IPW_TX_POWER_MIN_DBM (-12)
844#define IPW_TX_POWER_MAX_DBM 16 831#define IPW_TX_POWER_MAX_DBM 16
845 832
846#define FW_SCAN_DONOT_ASSOCIATE 0x0001 // Dont Attempt to Associate after Scan 833#define FW_SCAN_DONOT_ASSOCIATE 0x0001 // Dont Attempt to Associate after Scan
847#define FW_SCAN_PASSIVE 0x0008 // Force PASSSIVE Scan 834#define FW_SCAN_PASSIVE 0x0008 // Force PASSSIVE Scan
848 835
849#define REG_MIN_CHANNEL 0 836#define REG_MIN_CHANNEL 0
850#define REG_MAX_CHANNEL 14 837#define REG_MAX_CHANNEL 14
@@ -856,7 +843,6 @@ struct ipw2100_rx {
856#define DIVERSITY_ANTENNA_A 1 // Use antenna A 843#define DIVERSITY_ANTENNA_A 1 // Use antenna A
857#define DIVERSITY_ANTENNA_B 2 // Use antenna B 844#define DIVERSITY_ANTENNA_B 2 // Use antenna B
858 845
859
860#define HOST_COMMAND_WAIT 0 846#define HOST_COMMAND_WAIT 0
861#define HOST_COMMAND_NO_WAIT 1 847#define HOST_COMMAND_NO_WAIT 1
862 848
@@ -873,10 +859,9 @@ struct ipw2100_rx {
873#define TYPE_ASSOCIATION_REQUEST 0x0013 859#define TYPE_ASSOCIATION_REQUEST 0x0013
874#define TYPE_REASSOCIATION_REQUEST 0x0014 860#define TYPE_REASSOCIATION_REQUEST 0x0014
875 861
876 862#define HW_FEATURE_RFKILL 0x0001
877#define HW_FEATURE_RFKILL (0x0001) 863#define RF_KILLSWITCH_OFF 1
878#define RF_KILLSWITCH_OFF (1) 864#define RF_KILLSWITCH_ON 0
879#define RF_KILLSWITCH_ON (0)
880 865
881#define IPW_COMMAND_POOL_SIZE 40 866#define IPW_COMMAND_POOL_SIZE 40
882 867
@@ -895,7 +880,7 @@ struct ipw2100_rx {
895// Fixed size data: Ordinal Table 1 880// Fixed size data: Ordinal Table 1
896typedef enum _ORDINAL_TABLE_1 { // NS - means Not Supported by FW 881typedef enum _ORDINAL_TABLE_1 { // NS - means Not Supported by FW
897// Transmit statistics 882// Transmit statistics
898 IPW_ORD_STAT_TX_HOST_REQUESTS = 1,// # of requested Host Tx's (MSDU) 883 IPW_ORD_STAT_TX_HOST_REQUESTS = 1, // # of requested Host Tx's (MSDU)
899 IPW_ORD_STAT_TX_HOST_COMPLETE, // # of successful Host Tx's (MSDU) 884 IPW_ORD_STAT_TX_HOST_COMPLETE, // # of successful Host Tx's (MSDU)
900 IPW_ORD_STAT_TX_DIR_DATA, // # of successful Directed Tx's (MSDU) 885 IPW_ORD_STAT_TX_DIR_DATA, // # of successful Directed Tx's (MSDU)
901 886
@@ -905,42 +890,42 @@ typedef enum _ORDINAL_TABLE_1 { // NS - means Not Supported by FW
905 IPW_ORD_STAT_TX_DIR_DATA11, // # of successful Directed Tx's (MSDU) @ 11MB 890 IPW_ORD_STAT_TX_DIR_DATA11, // # of successful Directed Tx's (MSDU) @ 11MB
906 IPW_ORD_STAT_TX_DIR_DATA22, // # of successful Directed Tx's (MSDU) @ 22MB 891 IPW_ORD_STAT_TX_DIR_DATA22, // # of successful Directed Tx's (MSDU) @ 22MB
907 892
908 IPW_ORD_STAT_TX_NODIR_DATA1 = 13,// # of successful Non_Directed Tx's (MSDU) @ 1MB 893 IPW_ORD_STAT_TX_NODIR_DATA1 = 13, // # of successful Non_Directed Tx's (MSDU) @ 1MB
909 IPW_ORD_STAT_TX_NODIR_DATA2, // # of successful Non_Directed Tx's (MSDU) @ 2MB 894 IPW_ORD_STAT_TX_NODIR_DATA2, // # of successful Non_Directed Tx's (MSDU) @ 2MB
910 IPW_ORD_STAT_TX_NODIR_DATA5_5, // # of successful Non_Directed Tx's (MSDU) @ 5.5MB 895 IPW_ORD_STAT_TX_NODIR_DATA5_5, // # of successful Non_Directed Tx's (MSDU) @ 5.5MB
911 IPW_ORD_STAT_TX_NODIR_DATA11, // # of successful Non_Directed Tx's (MSDU) @ 11MB 896 IPW_ORD_STAT_TX_NODIR_DATA11, // # of successful Non_Directed Tx's (MSDU) @ 11MB
912 897
913 IPW_ORD_STAT_NULL_DATA = 21, // # of successful NULL data Tx's 898 IPW_ORD_STAT_NULL_DATA = 21, // # of successful NULL data Tx's
914 IPW_ORD_STAT_TX_RTS, // # of successful Tx RTS 899 IPW_ORD_STAT_TX_RTS, // # of successful Tx RTS
915 IPW_ORD_STAT_TX_CTS, // # of successful Tx CTS 900 IPW_ORD_STAT_TX_CTS, // # of successful Tx CTS
916 IPW_ORD_STAT_TX_ACK, // # of successful Tx ACK 901 IPW_ORD_STAT_TX_ACK, // # of successful Tx ACK
917 IPW_ORD_STAT_TX_ASSN, // # of successful Association Tx's 902 IPW_ORD_STAT_TX_ASSN, // # of successful Association Tx's
918 IPW_ORD_STAT_TX_ASSN_RESP, // # of successful Association response Tx's 903 IPW_ORD_STAT_TX_ASSN_RESP, // # of successful Association response Tx's
919 IPW_ORD_STAT_TX_REASSN, // # of successful Reassociation Tx's 904 IPW_ORD_STAT_TX_REASSN, // # of successful Reassociation Tx's
920 IPW_ORD_STAT_TX_REASSN_RESP, // # of successful Reassociation response Tx's 905 IPW_ORD_STAT_TX_REASSN_RESP, // # of successful Reassociation response Tx's
921 IPW_ORD_STAT_TX_PROBE, // # of probes successfully transmitted 906 IPW_ORD_STAT_TX_PROBE, // # of probes successfully transmitted
922 IPW_ORD_STAT_TX_PROBE_RESP, // # of probe responses successfully transmitted 907 IPW_ORD_STAT_TX_PROBE_RESP, // # of probe responses successfully transmitted
923 IPW_ORD_STAT_TX_BEACON, // # of tx beacon 908 IPW_ORD_STAT_TX_BEACON, // # of tx beacon
924 IPW_ORD_STAT_TX_ATIM, // # of Tx ATIM 909 IPW_ORD_STAT_TX_ATIM, // # of Tx ATIM
925 IPW_ORD_STAT_TX_DISASSN, // # of successful Disassociation TX 910 IPW_ORD_STAT_TX_DISASSN, // # of successful Disassociation TX
926 IPW_ORD_STAT_TX_AUTH, // # of successful Authentication Tx 911 IPW_ORD_STAT_TX_AUTH, // # of successful Authentication Tx
927 IPW_ORD_STAT_TX_DEAUTH, // # of successful Deauthentication TX 912 IPW_ORD_STAT_TX_DEAUTH, // # of successful Deauthentication TX
928 913
929 IPW_ORD_STAT_TX_TOTAL_BYTES = 41,// Total successful Tx data bytes 914 IPW_ORD_STAT_TX_TOTAL_BYTES = 41, // Total successful Tx data bytes
930 IPW_ORD_STAT_TX_RETRIES, // # of Tx retries 915 IPW_ORD_STAT_TX_RETRIES, // # of Tx retries
931 IPW_ORD_STAT_TX_RETRY1, // # of Tx retries at 1MBPS 916 IPW_ORD_STAT_TX_RETRY1, // # of Tx retries at 1MBPS
932 IPW_ORD_STAT_TX_RETRY2, // # of Tx retries at 2MBPS 917 IPW_ORD_STAT_TX_RETRY2, // # of Tx retries at 2MBPS
933 IPW_ORD_STAT_TX_RETRY5_5, // # of Tx retries at 5.5MBPS 918 IPW_ORD_STAT_TX_RETRY5_5, // # of Tx retries at 5.5MBPS
934 IPW_ORD_STAT_TX_RETRY11, // # of Tx retries at 11MBPS 919 IPW_ORD_STAT_TX_RETRY11, // # of Tx retries at 11MBPS
935 920
936 IPW_ORD_STAT_TX_FAILURES = 51, // # of Tx Failures 921 IPW_ORD_STAT_TX_FAILURES = 51, // # of Tx Failures
937 IPW_ORD_STAT_TX_ABORT_AT_HOP, //NS // # of Tx's aborted at hop time 922 IPW_ORD_STAT_TX_ABORT_AT_HOP, //NS // # of Tx's aborted at hop time
938 IPW_ORD_STAT_TX_MAX_TRIES_IN_HOP,// # of times max tries in a hop failed 923 IPW_ORD_STAT_TX_MAX_TRIES_IN_HOP, // # of times max tries in a hop failed
939 IPW_ORD_STAT_TX_ABORT_LATE_DMA, //NS // # of times tx aborted due to late dma setup 924 IPW_ORD_STAT_TX_ABORT_LATE_DMA, //NS // # of times tx aborted due to late dma setup
940 IPW_ORD_STAT_TX_ABORT_STX, //NS // # of times backoff aborted 925 IPW_ORD_STAT_TX_ABORT_STX, //NS // # of times backoff aborted
941 IPW_ORD_STAT_TX_DISASSN_FAIL, // # of times disassociation failed 926 IPW_ORD_STAT_TX_DISASSN_FAIL, // # of times disassociation failed
942 IPW_ORD_STAT_TX_ERR_CTS, // # of missed/bad CTS frames 927 IPW_ORD_STAT_TX_ERR_CTS, // # of missed/bad CTS frames
943 IPW_ORD_STAT_TX_BPDU, //NS // # of spanning tree BPDUs sent 928 IPW_ORD_STAT_TX_BPDU, //NS // # of spanning tree BPDUs sent
944 IPW_ORD_STAT_TX_ERR_ACK, // # of tx err due to acks 929 IPW_ORD_STAT_TX_ERR_ACK, // # of tx err due to acks
945 930
946 // Receive statistics 931 // Receive statistics
@@ -952,7 +937,7 @@ typedef enum _ORDINAL_TABLE_1 { // NS - means Not Supported by FW
952 IPW_ORD_STAT_RX_DIR_DATA11, // # of directed packets at 11MB 937 IPW_ORD_STAT_RX_DIR_DATA11, // # of directed packets at 11MB
953 IPW_ORD_STAT_RX_DIR_DATA22, // # of directed packets at 22MB 938 IPW_ORD_STAT_RX_DIR_DATA22, // # of directed packets at 22MB
954 939
955 IPW_ORD_STAT_RX_NODIR_DATA = 71,// # of nondirected packets 940 IPW_ORD_STAT_RX_NODIR_DATA = 71, // # of nondirected packets
956 IPW_ORD_STAT_RX_NODIR_DATA1, // # of nondirected packets at 1MB 941 IPW_ORD_STAT_RX_NODIR_DATA1, // # of nondirected packets at 1MB
957 IPW_ORD_STAT_RX_NODIR_DATA2, // # of nondirected packets at 2MB 942 IPW_ORD_STAT_RX_NODIR_DATA2, // # of nondirected packets at 2MB
958 IPW_ORD_STAT_RX_NODIR_DATA5_5, // # of nondirected packets at 5.5MB 943 IPW_ORD_STAT_RX_NODIR_DATA5_5, // # of nondirected packets at 5.5MB
@@ -977,18 +962,18 @@ typedef enum _ORDINAL_TABLE_1 { // NS - means Not Supported by FW
977 IPW_ORD_STAT_RX_AUTH, // # of authentication Rx 962 IPW_ORD_STAT_RX_AUTH, // # of authentication Rx
978 IPW_ORD_STAT_RX_DEAUTH, // # of deauthentication Rx 963 IPW_ORD_STAT_RX_DEAUTH, // # of deauthentication Rx
979 964
980 IPW_ORD_STAT_RX_TOTAL_BYTES = 101,// Total rx data bytes received 965 IPW_ORD_STAT_RX_TOTAL_BYTES = 101, // Total rx data bytes received
981 IPW_ORD_STAT_RX_ERR_CRC, // # of packets with Rx CRC error 966 IPW_ORD_STAT_RX_ERR_CRC, // # of packets with Rx CRC error
982 IPW_ORD_STAT_RX_ERR_CRC1, // # of Rx CRC errors at 1MB 967 IPW_ORD_STAT_RX_ERR_CRC1, // # of Rx CRC errors at 1MB
983 IPW_ORD_STAT_RX_ERR_CRC2, // # of Rx CRC errors at 2MB 968 IPW_ORD_STAT_RX_ERR_CRC2, // # of Rx CRC errors at 2MB
984 IPW_ORD_STAT_RX_ERR_CRC5_5, // # of Rx CRC errors at 5.5MB 969 IPW_ORD_STAT_RX_ERR_CRC5_5, // # of Rx CRC errors at 5.5MB
985 IPW_ORD_STAT_RX_ERR_CRC11, // # of Rx CRC errors at 11MB 970 IPW_ORD_STAT_RX_ERR_CRC11, // # of Rx CRC errors at 11MB
986 971
987 IPW_ORD_STAT_RX_DUPLICATE1 = 112, // # of duplicate rx packets at 1MB 972 IPW_ORD_STAT_RX_DUPLICATE1 = 112, // # of duplicate rx packets at 1MB
988 IPW_ORD_STAT_RX_DUPLICATE2, // # of duplicate rx packets at 2MB 973 IPW_ORD_STAT_RX_DUPLICATE2, // # of duplicate rx packets at 2MB
989 IPW_ORD_STAT_RX_DUPLICATE5_5, // # of duplicate rx packets at 5.5MB 974 IPW_ORD_STAT_RX_DUPLICATE5_5, // # of duplicate rx packets at 5.5MB
990 IPW_ORD_STAT_RX_DUPLICATE11, // # of duplicate rx packets at 11MB 975 IPW_ORD_STAT_RX_DUPLICATE11, // # of duplicate rx packets at 11MB
991 IPW_ORD_STAT_RX_DUPLICATE = 119, // # of duplicate rx packets 976 IPW_ORD_STAT_RX_DUPLICATE = 119, // # of duplicate rx packets
992 977
993 IPW_ORD_PERS_DB_LOCK = 120, // # locking fw permanent db 978 IPW_ORD_PERS_DB_LOCK = 120, // # locking fw permanent db
994 IPW_ORD_PERS_DB_SIZE, // # size of fw permanent db 979 IPW_ORD_PERS_DB_SIZE, // # size of fw permanent db
@@ -1006,17 +991,17 @@ typedef enum _ORDINAL_TABLE_1 { // NS - means Not Supported by FW
1006 IPW_ORD_STAT_RX_ICV_ERRORS, // # of ICV errors during decryption 991 IPW_ORD_STAT_RX_ICV_ERRORS, // # of ICV errors during decryption
1007 992
1008// PSP Statistics 993// PSP Statistics
1009 IPW_ORD_STAT_PSP_SUSPENSION = 137,// # of times adapter suspended 994 IPW_ORD_STAT_PSP_SUSPENSION = 137, // # of times adapter suspended
1010 IPW_ORD_STAT_PSP_BCN_TIMEOUT, // # of beacon timeout 995 IPW_ORD_STAT_PSP_BCN_TIMEOUT, // # of beacon timeout
1011 IPW_ORD_STAT_PSP_POLL_TIMEOUT, // # of poll response timeouts 996 IPW_ORD_STAT_PSP_POLL_TIMEOUT, // # of poll response timeouts
1012 IPW_ORD_STAT_PSP_NONDIR_TIMEOUT,// # of timeouts waiting for last broadcast/muticast pkt 997 IPW_ORD_STAT_PSP_NONDIR_TIMEOUT, // # of timeouts waiting for last broadcast/muticast pkt
1013 IPW_ORD_STAT_PSP_RX_DTIMS, // # of PSP DTIMs received 998 IPW_ORD_STAT_PSP_RX_DTIMS, // # of PSP DTIMs received
1014 IPW_ORD_STAT_PSP_RX_TIMS, // # of PSP TIMs received 999 IPW_ORD_STAT_PSP_RX_TIMS, // # of PSP TIMs received
1015 IPW_ORD_STAT_PSP_STATION_ID, // PSP Station ID 1000 IPW_ORD_STAT_PSP_STATION_ID, // PSP Station ID
1016 1001
1017// Association and roaming 1002// Association and roaming
1018 IPW_ORD_LAST_ASSN_TIME = 147, // RTC time of last association 1003 IPW_ORD_LAST_ASSN_TIME = 147, // RTC time of last association
1019 IPW_ORD_STAT_PERCENT_MISSED_BCNS,// current calculation of % missed beacons 1004 IPW_ORD_STAT_PERCENT_MISSED_BCNS, // current calculation of % missed beacons
1020 IPW_ORD_STAT_PERCENT_RETRIES, // current calculation of % missed tx retries 1005 IPW_ORD_STAT_PERCENT_RETRIES, // current calculation of % missed tx retries
1021 IPW_ORD_ASSOCIATED_AP_PTR, // If associated, this is ptr to the associated 1006 IPW_ORD_ASSOCIATED_AP_PTR, // If associated, this is ptr to the associated
1022 // AP table entry. set to 0 if not associated 1007 // AP table entry. set to 0 if not associated
@@ -1151,7 +1136,7 @@ struct ipw2100_fw_chunk {
1151}; 1136};
1152 1137
1153struct ipw2100_fw_chunk_set { 1138struct ipw2100_fw_chunk_set {
1154 const void *data; 1139 const void *data;
1155 unsigned long size; 1140 unsigned long size;
1156}; 1141};
1157 1142
@@ -1164,4 +1149,4 @@ struct ipw2100_fw {
1164 1149
1165#define MAX_FW_VERSION_LEN 14 1150#define MAX_FW_VERSION_LEN 14
1166 1151
1167#endif /* _IPW2100_H */ 1152#endif /* _IPW2100_H */
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index 3db0c32afe82..136884cef908 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -1,6 +1,6 @@
1/****************************************************************************** 1/******************************************************************************
2 2
3 Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved. 3 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
4 4
5 802.11 status code portion of this file from ethereal-0.10.6: 5 802.11 status code portion of this file from ethereal-0.10.6:
6 Copyright 2000, Axis Communications AB 6 Copyright 2000, Axis Communications AB
@@ -32,29 +32,101 @@
32 32
33#include "ipw2200.h" 33#include "ipw2200.h"
34 34
35#define IPW2200_VERSION "1.0.0" 35#define IPW2200_VERSION "git-1.0.8"
36#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver" 36#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver"
37#define DRV_COPYRIGHT "Copyright(c) 2003-2004 Intel Corporation" 37#define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation"
38#define DRV_VERSION IPW2200_VERSION 38#define DRV_VERSION IPW2200_VERSION
39 39
40#define ETH_P_80211_STATS (ETH_P_80211_RAW + 1)
41
40MODULE_DESCRIPTION(DRV_DESCRIPTION); 42MODULE_DESCRIPTION(DRV_DESCRIPTION);
41MODULE_VERSION(DRV_VERSION); 43MODULE_VERSION(DRV_VERSION);
42MODULE_AUTHOR(DRV_COPYRIGHT); 44MODULE_AUTHOR(DRV_COPYRIGHT);
43MODULE_LICENSE("GPL"); 45MODULE_LICENSE("GPL");
44 46
47static int cmdlog = 0;
45static int debug = 0; 48static int debug = 0;
46static int channel = 0; 49static int channel = 0;
47static char *ifname;
48static int mode = 0; 50static int mode = 0;
49 51
50static u32 ipw_debug_level; 52static u32 ipw_debug_level;
51static int associate = 1; 53static int associate = 1;
52static int auto_create = 1; 54static int auto_create = 1;
55static int led = 0;
53static int disable = 0; 56static int disable = 0;
57static int hwcrypto = 1;
54static const char ipw_modes[] = { 58static const char ipw_modes[] = {
55 'a', 'b', 'g', '?' 59 'a', 'b', 'g', '?'
56}; 60};
57 61
62#ifdef CONFIG_IPW_QOS
63static int qos_enable = 0;
64static int qos_burst_enable = 0;
65static int qos_no_ack_mask = 0;
66static int burst_duration_CCK = 0;
67static int burst_duration_OFDM = 0;
68
69static struct ieee80211_qos_parameters def_qos_parameters_OFDM = {
70 {QOS_TX0_CW_MIN_OFDM, QOS_TX1_CW_MIN_OFDM, QOS_TX2_CW_MIN_OFDM,
71 QOS_TX3_CW_MIN_OFDM},
72 {QOS_TX0_CW_MAX_OFDM, QOS_TX1_CW_MAX_OFDM, QOS_TX2_CW_MAX_OFDM,
73 QOS_TX3_CW_MAX_OFDM},
74 {QOS_TX0_AIFS, QOS_TX1_AIFS, QOS_TX2_AIFS, QOS_TX3_AIFS},
75 {QOS_TX0_ACM, QOS_TX1_ACM, QOS_TX2_ACM, QOS_TX3_ACM},
76 {QOS_TX0_TXOP_LIMIT_OFDM, QOS_TX1_TXOP_LIMIT_OFDM,
77 QOS_TX2_TXOP_LIMIT_OFDM, QOS_TX3_TXOP_LIMIT_OFDM}
78};
79
80static struct ieee80211_qos_parameters def_qos_parameters_CCK = {
81 {QOS_TX0_CW_MIN_CCK, QOS_TX1_CW_MIN_CCK, QOS_TX2_CW_MIN_CCK,
82 QOS_TX3_CW_MIN_CCK},
83 {QOS_TX0_CW_MAX_CCK, QOS_TX1_CW_MAX_CCK, QOS_TX2_CW_MAX_CCK,
84 QOS_TX3_CW_MAX_CCK},
85 {QOS_TX0_AIFS, QOS_TX1_AIFS, QOS_TX2_AIFS, QOS_TX3_AIFS},
86 {QOS_TX0_ACM, QOS_TX1_ACM, QOS_TX2_ACM, QOS_TX3_ACM},
87 {QOS_TX0_TXOP_LIMIT_CCK, QOS_TX1_TXOP_LIMIT_CCK, QOS_TX2_TXOP_LIMIT_CCK,
88 QOS_TX3_TXOP_LIMIT_CCK}
89};
90
91static struct ieee80211_qos_parameters def_parameters_OFDM = {
92 {DEF_TX0_CW_MIN_OFDM, DEF_TX1_CW_MIN_OFDM, DEF_TX2_CW_MIN_OFDM,
93 DEF_TX3_CW_MIN_OFDM},
94 {DEF_TX0_CW_MAX_OFDM, DEF_TX1_CW_MAX_OFDM, DEF_TX2_CW_MAX_OFDM,
95 DEF_TX3_CW_MAX_OFDM},
96 {DEF_TX0_AIFS, DEF_TX1_AIFS, DEF_TX2_AIFS, DEF_TX3_AIFS},
97 {DEF_TX0_ACM, DEF_TX1_ACM, DEF_TX2_ACM, DEF_TX3_ACM},
98 {DEF_TX0_TXOP_LIMIT_OFDM, DEF_TX1_TXOP_LIMIT_OFDM,
99 DEF_TX2_TXOP_LIMIT_OFDM, DEF_TX3_TXOP_LIMIT_OFDM}
100};
101
102static struct ieee80211_qos_parameters def_parameters_CCK = {
103 {DEF_TX0_CW_MIN_CCK, DEF_TX1_CW_MIN_CCK, DEF_TX2_CW_MIN_CCK,
104 DEF_TX3_CW_MIN_CCK},
105 {DEF_TX0_CW_MAX_CCK, DEF_TX1_CW_MAX_CCK, DEF_TX2_CW_MAX_CCK,
106 DEF_TX3_CW_MAX_CCK},
107 {DEF_TX0_AIFS, DEF_TX1_AIFS, DEF_TX2_AIFS, DEF_TX3_AIFS},
108 {DEF_TX0_ACM, DEF_TX1_ACM, DEF_TX2_ACM, DEF_TX3_ACM},
109 {DEF_TX0_TXOP_LIMIT_CCK, DEF_TX1_TXOP_LIMIT_CCK, DEF_TX2_TXOP_LIMIT_CCK,
110 DEF_TX3_TXOP_LIMIT_CCK}
111};
112
113static u8 qos_oui[QOS_OUI_LEN] = { 0x00, 0x50, 0xF2 };
114
115static int from_priority_to_tx_queue[] = {
116 IPW_TX_QUEUE_1, IPW_TX_QUEUE_2, IPW_TX_QUEUE_2, IPW_TX_QUEUE_1,
117 IPW_TX_QUEUE_3, IPW_TX_QUEUE_3, IPW_TX_QUEUE_4, IPW_TX_QUEUE_4
118};
119
120static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv);
121
122static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters
123 *qos_param);
124static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element
125 *qos_param);
126#endif /* CONFIG_IPW_QOS */
127
128static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev);
129static void ipw_remove_current_network(struct ipw_priv *priv);
58static void ipw_rx(struct ipw_priv *priv); 130static void ipw_rx(struct ipw_priv *priv);
59static int ipw_queue_tx_reclaim(struct ipw_priv *priv, 131static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
60 struct clx2_tx_queue *txq, int qindex); 132 struct clx2_tx_queue *txq, int qindex);
@@ -68,42 +140,24 @@ static void ipw_tx_queue_free(struct ipw_priv *);
68static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *); 140static struct ipw_rx_queue *ipw_rx_queue_alloc(struct ipw_priv *);
69static void ipw_rx_queue_free(struct ipw_priv *, struct ipw_rx_queue *); 141static void ipw_rx_queue_free(struct ipw_priv *, struct ipw_rx_queue *);
70static void ipw_rx_queue_replenish(void *); 142static void ipw_rx_queue_replenish(void *);
71
72static int ipw_up(struct ipw_priv *); 143static int ipw_up(struct ipw_priv *);
144static void ipw_bg_up(void *);
73static void ipw_down(struct ipw_priv *); 145static void ipw_down(struct ipw_priv *);
146static void ipw_bg_down(void *);
74static int ipw_config(struct ipw_priv *); 147static int ipw_config(struct ipw_priv *);
75static int init_supported_rates(struct ipw_priv *priv, 148static int init_supported_rates(struct ipw_priv *priv,
76 struct ipw_supported_rates *prates); 149 struct ipw_supported_rates *prates);
150static void ipw_set_hwcrypto_keys(struct ipw_priv *);
151static void ipw_send_wep_keys(struct ipw_priv *, int);
77 152
78static u8 band_b_active_channel[MAX_B_CHANNELS] = { 153static int ipw_is_valid_channel(struct ieee80211_device *, u8);
79 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0 154static int ipw_channel_to_index(struct ieee80211_device *, u8);
80}; 155static u8 ipw_freq_to_channel(struct ieee80211_device *, u32);
81static u8 band_a_active_channel[MAX_A_CHANNELS] = { 156static int ipw_set_geo(struct ieee80211_device *, const struct ieee80211_geo *);
82 36, 40, 44, 48, 149, 153, 157, 161, 165, 52, 56, 60, 64, 0 157static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *);
83};
84 158
85static int is_valid_channel(int mode_mask, int channel) 159static int snprint_line(char *buf, size_t count,
86{ 160 const u8 * data, u32 len, u32 ofs)
87 int i;
88
89 if (!channel)
90 return 0;
91
92 if (mode_mask & IEEE_A)
93 for (i = 0; i < MAX_A_CHANNELS; i++)
94 if (band_a_active_channel[i] == channel)
95 return IEEE_A;
96
97 if (mode_mask & (IEEE_B | IEEE_G))
98 for (i = 0; i < MAX_B_CHANNELS; i++)
99 if (band_b_active_channel[i] == channel)
100 return mode_mask & (IEEE_B | IEEE_G);
101
102 return 0;
103}
104
105static char *snprint_line(char *buf, size_t count,
106 const u8 * data, u32 len, u32 ofs)
107{ 161{
108 int out, i, j, l; 162 int out, i, j, l;
109 char c; 163 char c;
@@ -134,7 +188,7 @@ static char *snprint_line(char *buf, size_t count,
134 out += snprintf(buf + out, count - out, " "); 188 out += snprintf(buf + out, count - out, " ");
135 } 189 }
136 190
137 return buf; 191 return out;
138} 192}
139 193
140static void printk_buf(int level, const u8 * data, u32 len) 194static void printk_buf(int level, const u8 * data, u32 len)
@@ -145,14 +199,33 @@ static void printk_buf(int level, const u8 * data, u32 len)
145 return; 199 return;
146 200
147 while (len) { 201 while (len) {
148 printk(KERN_DEBUG "%s\n", 202 snprint_line(line, sizeof(line), &data[ofs],
149 snprint_line(line, sizeof(line), &data[ofs], 203 min(len, 16U), ofs);
150 min(len, 16U), ofs)); 204 printk(KERN_DEBUG "%s\n", line);
151 ofs += 16; 205 ofs += 16;
152 len -= min(len, 16U); 206 len -= min(len, 16U);
153 } 207 }
154} 208}
155 209
210static int snprintk_buf(u8 * output, size_t size, const u8 * data, size_t len)
211{
212 size_t out = size;
213 u32 ofs = 0;
214 int total = 0;
215
216 while (size && len) {
217 out = snprint_line(output, size, &data[ofs],
218 min_t(size_t, len, 16U), ofs);
219
220 ofs += 16;
221 output += out;
222 size -= out;
223 len -= min_t(size_t, len, 16U);
224 total += out;
225 }
226 return total;
227}
228
156static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg); 229static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg);
157#define ipw_read_reg32(a, b) _ipw_read_reg32(a, b) 230#define ipw_read_reg32(a, b) _ipw_read_reg32(a, b)
158 231
@@ -226,38 +299,42 @@ static inline u32 __ipw_read32(char *f, u32 l, struct ipw_priv *ipw, u32 ofs)
226#define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs) 299#define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs)
227 300
228static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int); 301static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int);
229#define ipw_read_indirect(a, b, c, d) \ 302static inline void __ipw_read_indirect(const char *f, int l,
230 IPW_DEBUG_IO("%s %d: read_inddirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \ 303 struct ipw_priv *a, u32 b, u8 * c, int d)
231 _ipw_read_indirect(a, b, c, d) 304{
305 IPW_DEBUG_IO("%s %d: read_indirect(0x%08X) %d bytes\n", f, l, (u32) (b),
306 d);
307 _ipw_read_indirect(a, b, c, d);
308}
309
310#define ipw_read_indirect(a, b, c, d) __ipw_read_indirect(__FILE__, __LINE__, a, b, c, d)
232 311
233static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data, 312static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data,
234 int num); 313 int num);
235#define ipw_write_indirect(a, b, c, d) \ 314#define ipw_write_indirect(a, b, c, d) \
236 IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \ 315 IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \
237 _ipw_write_indirect(a, b, c, d) 316 _ipw_write_indirect(a, b, c, d)
238 317
239/* indirect write s */ 318/* indirect write s */
240static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) 319static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value)
241{ 320{
242 IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value); 321 IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value);
243 _ipw_write32(priv, CX2_INDIRECT_ADDR, reg); 322 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg);
244 _ipw_write32(priv, CX2_INDIRECT_DATA, value); 323 _ipw_write32(priv, IPW_INDIRECT_DATA, value);
245} 324}
246 325
247static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value) 326static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value)
248{ 327{
249 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); 328 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value);
250 _ipw_write32(priv, CX2_INDIRECT_ADDR, reg & CX2_INDIRECT_ADDR_MASK); 329 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
251 _ipw_write8(priv, CX2_INDIRECT_DATA, value); 330 _ipw_write8(priv, IPW_INDIRECT_DATA, value);
252 IPW_DEBUG_IO(" reg = 0x%8lX : value = 0x%8X\n",
253 (unsigned long)(priv->hw_base + CX2_INDIRECT_DATA), value);
254} 331}
255 332
256static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value) 333static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value)
257{ 334{
258 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); 335 IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value);
259 _ipw_write32(priv, CX2_INDIRECT_ADDR, reg & CX2_INDIRECT_ADDR_MASK); 336 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
260 _ipw_write16(priv, CX2_INDIRECT_DATA, value); 337 _ipw_write16(priv, IPW_INDIRECT_DATA, value);
261} 338}
262 339
263/* indirect read s */ 340/* indirect read s */
@@ -265,9 +342,9 @@ static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value)
265static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) 342static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg)
266{ 343{
267 u32 word; 344 u32 word;
268 _ipw_write32(priv, CX2_INDIRECT_ADDR, reg & CX2_INDIRECT_ADDR_MASK); 345 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK);
269 IPW_DEBUG_IO(" reg = 0x%8X : \n", reg); 346 IPW_DEBUG_IO(" reg = 0x%8X : \n", reg);
270 word = _ipw_read32(priv, CX2_INDIRECT_DATA); 347 word = _ipw_read32(priv, IPW_INDIRECT_DATA);
271 return (word >> ((reg & 0x3) * 8)) & 0xff; 348 return (word >> ((reg & 0x3) * 8)) & 0xff;
272} 349}
273 350
@@ -277,8 +354,8 @@ static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg)
277 354
278 IPW_DEBUG_IO("%p : reg = 0x%08x\n", priv, reg); 355 IPW_DEBUG_IO("%p : reg = 0x%08x\n", priv, reg);
279 356
280 _ipw_write32(priv, CX2_INDIRECT_ADDR, reg); 357 _ipw_write32(priv, IPW_INDIRECT_ADDR, reg);
281 value = _ipw_read32(priv, CX2_INDIRECT_DATA); 358 value = _ipw_read32(priv, IPW_INDIRECT_DATA);
282 IPW_DEBUG_IO(" reg = 0x%4X : value = 0x%4x \n", reg, value); 359 IPW_DEBUG_IO(" reg = 0x%4X : value = 0x%4x \n", reg, value);
283 return value; 360 return value;
284} 361}
@@ -287,67 +364,69 @@ static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg)
287static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, 364static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf,
288 int num) 365 int num)
289{ 366{
290 u32 aligned_addr = addr & CX2_INDIRECT_ADDR_MASK; 367 u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK;
291 u32 dif_len = addr - aligned_addr; 368 u32 dif_len = addr - aligned_addr;
292 u32 aligned_len;
293 u32 i; 369 u32 i;
294 370
295 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num); 371 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num);
296 372
373 if (num <= 0) {
374 return;
375 }
376
297 /* Read the first nibble byte by byte */ 377 /* Read the first nibble byte by byte */
298 if (unlikely(dif_len)) { 378 if (unlikely(dif_len)) {
379 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
299 /* Start reading at aligned_addr + dif_len */ 380 /* Start reading at aligned_addr + dif_len */
300 _ipw_write32(priv, CX2_INDIRECT_ADDR, aligned_addr); 381 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--)
301 for (i = dif_len; i < 4; i++, buf++) 382 *buf++ = _ipw_read8(priv, IPW_INDIRECT_DATA + i);
302 *buf = _ipw_read8(priv, CX2_INDIRECT_DATA + i);
303 num -= dif_len;
304 aligned_addr += 4; 383 aligned_addr += 4;
305 } 384 }
306 385
307 /* Read DWs through autoinc register */ 386 _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr);
308 _ipw_write32(priv, CX2_AUTOINC_ADDR, aligned_addr); 387 for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4)
309 aligned_len = num & CX2_INDIRECT_ADDR_MASK; 388 *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA);
310 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
311 *(u32 *) buf = ipw_read32(priv, CX2_AUTOINC_DATA);
312 389
313 /* Copy the last nibble */ 390 /* Copy the last nibble */
314 dif_len = num - aligned_len; 391 if (unlikely(num)) {
315 _ipw_write32(priv, CX2_INDIRECT_ADDR, aligned_addr); 392 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
316 for (i = 0; i < dif_len; i++, buf++) 393 for (i = 0; num > 0; i++, num--)
317 *buf = ipw_read8(priv, CX2_INDIRECT_DATA + i); 394 *buf++ = ipw_read8(priv, IPW_INDIRECT_DATA + i);
395 }
318} 396}
319 397
320static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, 398static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf,
321 int num) 399 int num)
322{ 400{
323 u32 aligned_addr = addr & CX2_INDIRECT_ADDR_MASK; 401 u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK;
324 u32 dif_len = addr - aligned_addr; 402 u32 dif_len = addr - aligned_addr;
325 u32 aligned_len;
326 u32 i; 403 u32 i;
327 404
328 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num); 405 IPW_DEBUG_IO("addr = %i, buf = %p, num = %i\n", addr, buf, num);
329 406
407 if (num <= 0) {
408 return;
409 }
410
330 /* Write the first nibble byte by byte */ 411 /* Write the first nibble byte by byte */
331 if (unlikely(dif_len)) { 412 if (unlikely(dif_len)) {
332 /* Start writing at aligned_addr + dif_len */ 413 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
333 _ipw_write32(priv, CX2_INDIRECT_ADDR, aligned_addr); 414 /* Start reading at aligned_addr + dif_len */
334 for (i = dif_len; i < 4; i++, buf++) 415 for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++)
335 _ipw_write8(priv, CX2_INDIRECT_DATA + i, *buf); 416 _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf);
336 num -= dif_len;
337 aligned_addr += 4; 417 aligned_addr += 4;
338 } 418 }
339 419
340 /* Write DWs through autoinc register */ 420 _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr);
341 _ipw_write32(priv, CX2_AUTOINC_ADDR, aligned_addr); 421 for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4)
342 aligned_len = num & CX2_INDIRECT_ADDR_MASK; 422 _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf);
343 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
344 _ipw_write32(priv, CX2_AUTOINC_DATA, *(u32 *) buf);
345 423
346 /* Copy the last nibble */ 424 /* Copy the last nibble */
347 dif_len = num - aligned_len; 425 if (unlikely(num)) {
348 _ipw_write32(priv, CX2_INDIRECT_ADDR, aligned_addr); 426 _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr);
349 for (i = 0; i < dif_len; i++, buf++) 427 for (i = 0; num > 0; i++, num--, buf++)
350 _ipw_write8(priv, CX2_INDIRECT_DATA + i, *buf); 428 _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf);
429 }
351} 430}
352 431
353static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf, 432static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf,
@@ -371,7 +450,7 @@ static inline void ipw_enable_interrupts(struct ipw_priv *priv)
371 if (priv->status & STATUS_INT_ENABLED) 450 if (priv->status & STATUS_INT_ENABLED)
372 return; 451 return;
373 priv->status |= STATUS_INT_ENABLED; 452 priv->status |= STATUS_INT_ENABLED;
374 ipw_write32(priv, CX2_INTA_MASK_R, CX2_INTA_MASK_ALL); 453 ipw_write32(priv, IPW_INTA_MASK_R, IPW_INTA_MASK_ALL);
375} 454}
376 455
377static inline void ipw_disable_interrupts(struct ipw_priv *priv) 456static inline void ipw_disable_interrupts(struct ipw_priv *priv)
@@ -379,9 +458,10 @@ static inline void ipw_disable_interrupts(struct ipw_priv *priv)
379 if (!(priv->status & STATUS_INT_ENABLED)) 458 if (!(priv->status & STATUS_INT_ENABLED))
380 return; 459 return;
381 priv->status &= ~STATUS_INT_ENABLED; 460 priv->status &= ~STATUS_INT_ENABLED;
382 ipw_write32(priv, CX2_INTA_MASK_R, ~CX2_INTA_MASK_ALL); 461 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
383} 462}
384 463
464#ifdef CONFIG_IPW_DEBUG
385static char *ipw_error_desc(u32 val) 465static char *ipw_error_desc(u32 val)
386{ 466{
387 switch (val) { 467 switch (val) {
@@ -394,81 +474,65 @@ static char *ipw_error_desc(u32 val)
394 case IPW_FW_ERROR_MEMORY_OVERFLOW: 474 case IPW_FW_ERROR_MEMORY_OVERFLOW:
395 return "MEMORY_OVERFLOW"; 475 return "MEMORY_OVERFLOW";
396 case IPW_FW_ERROR_BAD_PARAM: 476 case IPW_FW_ERROR_BAD_PARAM:
397 return "ERROR_BAD_PARAM"; 477 return "BAD_PARAM";
398 case IPW_FW_ERROR_BAD_CHECKSUM: 478 case IPW_FW_ERROR_BAD_CHECKSUM:
399 return "ERROR_BAD_CHECKSUM"; 479 return "BAD_CHECKSUM";
400 case IPW_FW_ERROR_NMI_INTERRUPT: 480 case IPW_FW_ERROR_NMI_INTERRUPT:
401 return "ERROR_NMI_INTERRUPT"; 481 return "NMI_INTERRUPT";
402 case IPW_FW_ERROR_BAD_DATABASE: 482 case IPW_FW_ERROR_BAD_DATABASE:
403 return "ERROR_BAD_DATABASE"; 483 return "BAD_DATABASE";
404 case IPW_FW_ERROR_ALLOC_FAIL: 484 case IPW_FW_ERROR_ALLOC_FAIL:
405 return "ERROR_ALLOC_FAIL"; 485 return "ALLOC_FAIL";
406 case IPW_FW_ERROR_DMA_UNDERRUN: 486 case IPW_FW_ERROR_DMA_UNDERRUN:
407 return "ERROR_DMA_UNDERRUN"; 487 return "DMA_UNDERRUN";
408 case IPW_FW_ERROR_DMA_STATUS: 488 case IPW_FW_ERROR_DMA_STATUS:
409 return "ERROR_DMA_STATUS"; 489 return "DMA_STATUS";
410 case IPW_FW_ERROR_DINOSTATUS_ERROR: 490 case IPW_FW_ERROR_DINO_ERROR:
411 return "ERROR_DINOSTATUS_ERROR"; 491 return "DINO_ERROR";
412 case IPW_FW_ERROR_EEPROMSTATUS_ERROR: 492 case IPW_FW_ERROR_EEPROM_ERROR:
413 return "ERROR_EEPROMSTATUS_ERROR"; 493 return "EEPROM_ERROR";
414 case IPW_FW_ERROR_SYSASSERT: 494 case IPW_FW_ERROR_SYSASSERT:
415 return "ERROR_SYSASSERT"; 495 return "SYSASSERT";
416 case IPW_FW_ERROR_FATAL_ERROR: 496 case IPW_FW_ERROR_FATAL_ERROR:
417 return "ERROR_FATALSTATUS_ERROR"; 497 return "FATAL_ERROR";
418 default: 498 default:
419 return "UNKNOWNSTATUS_ERROR"; 499 return "UNKNOWN_ERROR";
420 } 500 }
421} 501}
422 502
423static void ipw_dump_nic_error_log(struct ipw_priv *priv) 503static void ipw_dump_error_log(struct ipw_priv *priv,
504 struct ipw_fw_error *error)
424{ 505{
425 u32 desc, time, blink1, blink2, ilink1, ilink2, idata, i, count, base; 506 u32 i;
426
427 base = ipw_read32(priv, IPWSTATUS_ERROR_LOG);
428 count = ipw_read_reg32(priv, base);
429 507
430 if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) { 508 if (!error) {
431 IPW_ERROR("Start IPW Error Log Dump:\n"); 509 IPW_ERROR("Error allocating and capturing error log. "
432 IPW_ERROR("Status: 0x%08X, Config: %08X\n", 510 "Nothing to dump.\n");
433 priv->status, priv->config); 511 return;
434 } 512 }
435 513
436 for (i = ERROR_START_OFFSET; 514 IPW_ERROR("Start IPW Error Log Dump:\n");
437 i <= count * ERROR_ELEM_SIZE; i += ERROR_ELEM_SIZE) { 515 IPW_ERROR("Status: 0x%08X, Config: %08X\n",
438 desc = ipw_read_reg32(priv, base + i); 516 error->status, error->config);
439 time = ipw_read_reg32(priv, base + i + 1 * sizeof(u32));
440 blink1 = ipw_read_reg32(priv, base + i + 2 * sizeof(u32));
441 blink2 = ipw_read_reg32(priv, base + i + 3 * sizeof(u32));
442 ilink1 = ipw_read_reg32(priv, base + i + 4 * sizeof(u32));
443 ilink2 = ipw_read_reg32(priv, base + i + 5 * sizeof(u32));
444 idata = ipw_read_reg32(priv, base + i + 6 * sizeof(u32));
445 517
518 for (i = 0; i < error->elem_len; i++)
446 IPW_ERROR("%s %i 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", 519 IPW_ERROR("%s %i 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
447 ipw_error_desc(desc), time, blink1, blink2, 520 ipw_error_desc(error->elem[i].desc),
448 ilink1, ilink2, idata); 521 error->elem[i].time,
449 } 522 error->elem[i].blink1,
523 error->elem[i].blink2,
524 error->elem[i].link1,
525 error->elem[i].link2, error->elem[i].data);
526 for (i = 0; i < error->log_len; i++)
527 IPW_ERROR("%i\t0x%08x\t%i\n",
528 error->log[i].time,
529 error->log[i].data, error->log[i].event);
450} 530}
531#endif
451 532
452static void ipw_dump_nic_event_log(struct ipw_priv *priv) 533static inline int ipw_is_init(struct ipw_priv *priv)
453{ 534{
454 u32 ev, time, data, i, count, base; 535 return (priv->status & STATUS_INIT) ? 1 : 0;
455
456 base = ipw_read32(priv, IPW_EVENT_LOG);
457 count = ipw_read_reg32(priv, base);
458
459 if (EVENT_START_OFFSET <= count * EVENT_ELEM_SIZE)
460 IPW_ERROR("Start IPW Event Log Dump:\n");
461
462 for (i = EVENT_START_OFFSET;
463 i <= count * EVENT_ELEM_SIZE; i += EVENT_ELEM_SIZE) {
464 ev = ipw_read_reg32(priv, base + i);
465 time = ipw_read_reg32(priv, base + i + 1 * sizeof(u32));
466 data = ipw_read_reg32(priv, base + i + 2 * sizeof(u32));
467
468#ifdef CONFIG_IPW_DEBUG
469 IPW_ERROR("%i\t0x%08x\t%i\n", time, data, ev);
470#endif
471 }
472} 536}
473 537
474static int ipw_get_ordinal(struct ipw_priv *priv, u32 ord, void *val, u32 * len) 538static int ipw_get_ordinal(struct ipw_priv *priv, u32 ord, void *val, u32 * len)
@@ -636,6 +700,340 @@ static void ipw_init_ordinals(struct ipw_priv *priv)
636 700
637} 701}
638 702
703u32 ipw_register_toggle(u32 reg)
704{
705 reg &= ~IPW_START_STANDBY;
706 if (reg & IPW_GATE_ODMA)
707 reg &= ~IPW_GATE_ODMA;
708 if (reg & IPW_GATE_IDMA)
709 reg &= ~IPW_GATE_IDMA;
710 if (reg & IPW_GATE_ADMA)
711 reg &= ~IPW_GATE_ADMA;
712 return reg;
713}
714
715/*
716 * LED behavior:
717 * - On radio ON, turn on any LEDs that require to be on during start
718 * - On initialization, start unassociated blink
719 * - On association, disable unassociated blink
720 * - On disassociation, start unassociated blink
721 * - On radio OFF, turn off any LEDs started during radio on
722 *
723 */
724#define LD_TIME_LINK_ON 300
725#define LD_TIME_LINK_OFF 2700
726#define LD_TIME_ACT_ON 250
727
728void ipw_led_link_on(struct ipw_priv *priv)
729{
730 unsigned long flags;
731 u32 led;
732
733 /* If configured to not use LEDs, or nic_type is 1,
734 * then we don't toggle a LINK led */
735 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1)
736 return;
737
738 spin_lock_irqsave(&priv->lock, flags);
739
740 if (!(priv->status & STATUS_RF_KILL_MASK) &&
741 !(priv->status & STATUS_LED_LINK_ON)) {
742 IPW_DEBUG_LED("Link LED On\n");
743 led = ipw_read_reg32(priv, IPW_EVENT_REG);
744 led |= priv->led_association_on;
745
746 led = ipw_register_toggle(led);
747
748 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
749 ipw_write_reg32(priv, IPW_EVENT_REG, led);
750
751 priv->status |= STATUS_LED_LINK_ON;
752
753 /* If we aren't associated, schedule turning the LED off */
754 if (!(priv->status & STATUS_ASSOCIATED))
755 queue_delayed_work(priv->workqueue,
756 &priv->led_link_off,
757 LD_TIME_LINK_ON);
758 }
759
760 spin_unlock_irqrestore(&priv->lock, flags);
761}
762
763static void ipw_bg_led_link_on(void *data)
764{
765 struct ipw_priv *priv = data;
766 down(&priv->sem);
767 ipw_led_link_on(data);
768 up(&priv->sem);
769}
770
771void ipw_led_link_off(struct ipw_priv *priv)
772{
773 unsigned long flags;
774 u32 led;
775
776 /* If configured not to use LEDs, or nic type is 1,
777 * then we don't goggle the LINK led. */
778 if (priv->config & CFG_NO_LED || priv->nic_type == EEPROM_NIC_TYPE_1)
779 return;
780
781 spin_lock_irqsave(&priv->lock, flags);
782
783 if (priv->status & STATUS_LED_LINK_ON) {
784 led = ipw_read_reg32(priv, IPW_EVENT_REG);
785 led &= priv->led_association_off;
786 led = ipw_register_toggle(led);
787
788 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
789 ipw_write_reg32(priv, IPW_EVENT_REG, led);
790
791 IPW_DEBUG_LED("Link LED Off\n");
792
793 priv->status &= ~STATUS_LED_LINK_ON;
794
795 /* If we aren't associated and the radio is on, schedule
796 * turning the LED on (blink while unassociated) */
797 if (!(priv->status & STATUS_RF_KILL_MASK) &&
798 !(priv->status & STATUS_ASSOCIATED))
799 queue_delayed_work(priv->workqueue, &priv->led_link_on,
800 LD_TIME_LINK_OFF);
801
802 }
803
804 spin_unlock_irqrestore(&priv->lock, flags);
805}
806
807static void ipw_bg_led_link_off(void *data)
808{
809 struct ipw_priv *priv = data;
810 down(&priv->sem);
811 ipw_led_link_off(data);
812 up(&priv->sem);
813}
814
815static inline void __ipw_led_activity_on(struct ipw_priv *priv)
816{
817 u32 led;
818
819 if (priv->config & CFG_NO_LED)
820 return;
821
822 if (priv->status & STATUS_RF_KILL_MASK)
823 return;
824
825 if (!(priv->status & STATUS_LED_ACT_ON)) {
826 led = ipw_read_reg32(priv, IPW_EVENT_REG);
827 led |= priv->led_activity_on;
828
829 led = ipw_register_toggle(led);
830
831 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
832 ipw_write_reg32(priv, IPW_EVENT_REG, led);
833
834 IPW_DEBUG_LED("Activity LED On\n");
835
836 priv->status |= STATUS_LED_ACT_ON;
837
838 cancel_delayed_work(&priv->led_act_off);
839 queue_delayed_work(priv->workqueue, &priv->led_act_off,
840 LD_TIME_ACT_ON);
841 } else {
842 /* Reschedule LED off for full time period */
843 cancel_delayed_work(&priv->led_act_off);
844 queue_delayed_work(priv->workqueue, &priv->led_act_off,
845 LD_TIME_ACT_ON);
846 }
847}
848
849void ipw_led_activity_on(struct ipw_priv *priv)
850{
851 unsigned long flags;
852 spin_lock_irqsave(&priv->lock, flags);
853 __ipw_led_activity_on(priv);
854 spin_unlock_irqrestore(&priv->lock, flags);
855}
856
857void ipw_led_activity_off(struct ipw_priv *priv)
858{
859 unsigned long flags;
860 u32 led;
861
862 if (priv->config & CFG_NO_LED)
863 return;
864
865 spin_lock_irqsave(&priv->lock, flags);
866
867 if (priv->status & STATUS_LED_ACT_ON) {
868 led = ipw_read_reg32(priv, IPW_EVENT_REG);
869 led &= priv->led_activity_off;
870
871 led = ipw_register_toggle(led);
872
873 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
874 ipw_write_reg32(priv, IPW_EVENT_REG, led);
875
876 IPW_DEBUG_LED("Activity LED Off\n");
877
878 priv->status &= ~STATUS_LED_ACT_ON;
879 }
880
881 spin_unlock_irqrestore(&priv->lock, flags);
882}
883
884static void ipw_bg_led_activity_off(void *data)
885{
886 struct ipw_priv *priv = data;
887 down(&priv->sem);
888 ipw_led_activity_off(data);
889 up(&priv->sem);
890}
891
892void ipw_led_band_on(struct ipw_priv *priv)
893{
894 unsigned long flags;
895 u32 led;
896
897 /* Only nic type 1 supports mode LEDs */
898 if (priv->config & CFG_NO_LED ||
899 priv->nic_type != EEPROM_NIC_TYPE_1 || !priv->assoc_network)
900 return;
901
902 spin_lock_irqsave(&priv->lock, flags);
903
904 led = ipw_read_reg32(priv, IPW_EVENT_REG);
905 if (priv->assoc_network->mode == IEEE_A) {
906 led |= priv->led_ofdm_on;
907 led &= priv->led_association_off;
908 IPW_DEBUG_LED("Mode LED On: 802.11a\n");
909 } else if (priv->assoc_network->mode == IEEE_G) {
910 led |= priv->led_ofdm_on;
911 led |= priv->led_association_on;
912 IPW_DEBUG_LED("Mode LED On: 802.11g\n");
913 } else {
914 led &= priv->led_ofdm_off;
915 led |= priv->led_association_on;
916 IPW_DEBUG_LED("Mode LED On: 802.11b\n");
917 }
918
919 led = ipw_register_toggle(led);
920
921 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
922 ipw_write_reg32(priv, IPW_EVENT_REG, led);
923
924 spin_unlock_irqrestore(&priv->lock, flags);
925}
926
927void ipw_led_band_off(struct ipw_priv *priv)
928{
929 unsigned long flags;
930 u32 led;
931
932 /* Only nic type 1 supports mode LEDs */
933 if (priv->config & CFG_NO_LED || priv->nic_type != EEPROM_NIC_TYPE_1)
934 return;
935
936 spin_lock_irqsave(&priv->lock, flags);
937
938 led = ipw_read_reg32(priv, IPW_EVENT_REG);
939 led &= priv->led_ofdm_off;
940 led &= priv->led_association_off;
941
942 led = ipw_register_toggle(led);
943
944 IPW_DEBUG_LED("Reg: 0x%08X\n", led);
945 ipw_write_reg32(priv, IPW_EVENT_REG, led);
946
947 spin_unlock_irqrestore(&priv->lock, flags);
948}
949
950void ipw_led_radio_on(struct ipw_priv *priv)
951{
952 ipw_led_link_on(priv);
953}
954
955void ipw_led_radio_off(struct ipw_priv *priv)
956{
957 ipw_led_activity_off(priv);
958 ipw_led_link_off(priv);
959}
960
961void ipw_led_link_up(struct ipw_priv *priv)
962{
963 /* Set the Link Led on for all nic types */
964 ipw_led_link_on(priv);
965}
966
967void ipw_led_link_down(struct ipw_priv *priv)
968{
969 ipw_led_activity_off(priv);
970 ipw_led_link_off(priv);
971
972 if (priv->status & STATUS_RF_KILL_MASK)
973 ipw_led_radio_off(priv);
974}
975
976void ipw_led_init(struct ipw_priv *priv)
977{
978 priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE];
979
980 /* Set the default PINs for the link and activity leds */
981 priv->led_activity_on = IPW_ACTIVITY_LED;
982 priv->led_activity_off = ~(IPW_ACTIVITY_LED);
983
984 priv->led_association_on = IPW_ASSOCIATED_LED;
985 priv->led_association_off = ~(IPW_ASSOCIATED_LED);
986
987 /* Set the default PINs for the OFDM leds */
988 priv->led_ofdm_on = IPW_OFDM_LED;
989 priv->led_ofdm_off = ~(IPW_OFDM_LED);
990
991 switch (priv->nic_type) {
992 case EEPROM_NIC_TYPE_1:
993 /* In this NIC type, the LEDs are reversed.... */
994 priv->led_activity_on = IPW_ASSOCIATED_LED;
995 priv->led_activity_off = ~(IPW_ASSOCIATED_LED);
996 priv->led_association_on = IPW_ACTIVITY_LED;
997 priv->led_association_off = ~(IPW_ACTIVITY_LED);
998
999 if (!(priv->config & CFG_NO_LED))
1000 ipw_led_band_on(priv);
1001
1002 /* And we don't blink link LEDs for this nic, so
1003 * just return here */
1004 return;
1005
1006 case EEPROM_NIC_TYPE_3:
1007 case EEPROM_NIC_TYPE_2:
1008 case EEPROM_NIC_TYPE_4:
1009 case EEPROM_NIC_TYPE_0:
1010 break;
1011
1012 default:
1013 IPW_DEBUG_INFO("Unknown NIC type from EEPROM: %d\n",
1014 priv->nic_type);
1015 priv->nic_type = EEPROM_NIC_TYPE_0;
1016 break;
1017 }
1018
1019 if (!(priv->config & CFG_NO_LED)) {
1020 if (priv->status & STATUS_ASSOCIATED)
1021 ipw_led_link_on(priv);
1022 else
1023 ipw_led_link_off(priv);
1024 }
1025}
1026
1027void ipw_led_shutdown(struct ipw_priv *priv)
1028{
1029 ipw_led_activity_off(priv);
1030 ipw_led_link_off(priv);
1031 ipw_led_band_off(priv);
1032 cancel_delayed_work(&priv->led_link_on);
1033 cancel_delayed_work(&priv->led_link_off);
1034 cancel_delayed_work(&priv->led_act_off);
1035}
1036
639/* 1037/*
640 * The following adds a new attribute to the sysfs representation 1038 * The following adds a new attribute to the sysfs representation
641 * of this device driver (i.e. a new file in /sys/bus/pci/drivers/ipw/) 1039 * of this device driver (i.e. a new file in /sys/bus/pci/drivers/ipw/)
@@ -647,8 +1045,9 @@ static ssize_t show_debug_level(struct device_driver *d, char *buf)
647{ 1045{
648 return sprintf(buf, "0x%08X\n", ipw_debug_level); 1046 return sprintf(buf, "0x%08X\n", ipw_debug_level);
649} 1047}
650static ssize_t store_debug_level(struct device_driver *d, 1048
651 const char *buf, size_t count) 1049static ssize_t store_debug_level(struct device_driver *d, const char *buf,
1050 size_t count)
652{ 1051{
653 char *p = (char *)buf; 1052 char *p = (char *)buf;
654 u32 val; 1053 u32 val;
@@ -672,75 +1071,263 @@ static ssize_t store_debug_level(struct device_driver *d,
672static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, 1071static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO,
673 show_debug_level, store_debug_level); 1072 show_debug_level, store_debug_level);
674 1073
675static ssize_t show_status(struct device *d, 1074static inline u32 ipw_get_event_log_len(struct ipw_priv *priv)
676 struct device_attribute *attr, char *buf)
677{ 1075{
678 struct ipw_priv *p = d->driver_data; 1076 return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG));
679 return sprintf(buf, "0x%08x\n", (int)p->status);
680} 1077}
681 1078
682static DEVICE_ATTR(status, S_IRUGO, show_status, NULL); 1079static void ipw_capture_event_log(struct ipw_priv *priv,
1080 u32 log_len, struct ipw_event *log)
1081{
1082 u32 base;
683 1083
684static ssize_t show_cfg(struct device *d, struct device_attribute *attr, 1084 if (log_len) {
685 char *buf) 1085 base = ipw_read32(priv, IPW_EVENT_LOG);
1086 ipw_read_indirect(priv, base + sizeof(base) + sizeof(u32),
1087 (u8 *) log, sizeof(*log) * log_len);
1088 }
1089}
1090
1091static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv)
686{ 1092{
687 struct ipw_priv *p = d->driver_data; 1093 struct ipw_fw_error *error;
688 return sprintf(buf, "0x%08x\n", (int)p->config); 1094 u32 log_len = ipw_get_event_log_len(priv);
1095 u32 base = ipw_read32(priv, IPW_ERROR_LOG);
1096 u32 elem_len = ipw_read_reg32(priv, base);
1097
1098 error = kmalloc(sizeof(*error) +
1099 sizeof(*error->elem) * elem_len +
1100 sizeof(*error->log) * log_len, GFP_ATOMIC);
1101 if (!error) {
1102 IPW_ERROR("Memory allocation for firmware error log "
1103 "failed.\n");
1104 return NULL;
1105 }
1106 error->jiffies = jiffies;
1107 error->status = priv->status;
1108 error->config = priv->config;
1109 error->elem_len = elem_len;
1110 error->log_len = log_len;
1111 error->elem = (struct ipw_error_elem *)error->payload;
1112 error->log = (struct ipw_event *)(error->elem +
1113 (sizeof(*error->elem) * elem_len));
1114
1115 ipw_capture_event_log(priv, log_len, error->log);
1116
1117 if (elem_len)
1118 ipw_read_indirect(priv, base + sizeof(base), (u8 *) error->elem,
1119 sizeof(*error->elem) * elem_len);
1120
1121 return error;
689} 1122}
690 1123
691static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL); 1124static void ipw_free_error_log(struct ipw_fw_error *error)
1125{
1126 if (error)
1127 kfree(error);
1128}
692 1129
693static ssize_t show_nic_type(struct device *d, 1130static ssize_t show_event_log(struct device *d,
694 struct device_attribute *attr, char *buf) 1131 struct device_attribute *attr, char *buf)
695{ 1132{
696 struct ipw_priv *p = d->driver_data; 1133 struct ipw_priv *priv = dev_get_drvdata(d);
697 u8 type = p->eeprom[EEPROM_NIC_TYPE]; 1134 u32 log_len = ipw_get_event_log_len(priv);
1135 struct ipw_event log[log_len];
1136 u32 len = 0, i;
1137
1138 ipw_capture_event_log(priv, log_len, log);
1139
1140 len += snprintf(buf + len, PAGE_SIZE - len, "%08X", log_len);
1141 for (i = 0; i < log_len; i++)
1142 len += snprintf(buf + len, PAGE_SIZE - len,
1143 "\n%08X%08X%08X",
1144 log[i].time, log[i].event, log[i].data);
1145 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1146 return len;
1147}
698 1148
699 switch (type) { 1149static DEVICE_ATTR(event_log, S_IRUGO, show_event_log, NULL);
700 case EEPROM_NIC_TYPE_STANDARD: 1150
701 return sprintf(buf, "STANDARD\n"); 1151static ssize_t show_error(struct device *d,
702 case EEPROM_NIC_TYPE_DELL: 1152 struct device_attribute *attr, char *buf)
703 return sprintf(buf, "DELL\n"); 1153{
704 case EEPROM_NIC_TYPE_FUJITSU: 1154 struct ipw_priv *priv = dev_get_drvdata(d);
705 return sprintf(buf, "FUJITSU\n"); 1155 u32 len = 0, i;
706 case EEPROM_NIC_TYPE_IBM: 1156 if (!priv->error)
707 return sprintf(buf, "IBM\n"); 1157 return 0;
708 case EEPROM_NIC_TYPE_HP: 1158 len += snprintf(buf + len, PAGE_SIZE - len,
709 return sprintf(buf, "HP\n"); 1159 "%08lX%08X%08X%08X",
1160 priv->error->jiffies,
1161 priv->error->status,
1162 priv->error->config, priv->error->elem_len);
1163 for (i = 0; i < priv->error->elem_len; i++)
1164 len += snprintf(buf + len, PAGE_SIZE - len,
1165 "\n%08X%08X%08X%08X%08X%08X%08X",
1166 priv->error->elem[i].time,
1167 priv->error->elem[i].desc,
1168 priv->error->elem[i].blink1,
1169 priv->error->elem[i].blink2,
1170 priv->error->elem[i].link1,
1171 priv->error->elem[i].link2,
1172 priv->error->elem[i].data);
1173
1174 len += snprintf(buf + len, PAGE_SIZE - len,
1175 "\n%08X", priv->error->log_len);
1176 for (i = 0; i < priv->error->log_len; i++)
1177 len += snprintf(buf + len, PAGE_SIZE - len,
1178 "\n%08X%08X%08X",
1179 priv->error->log[i].time,
1180 priv->error->log[i].event,
1181 priv->error->log[i].data);
1182 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1183 return len;
1184}
1185
1186static ssize_t clear_error(struct device *d,
1187 struct device_attribute *attr,
1188 const char *buf, size_t count)
1189{
1190 struct ipw_priv *priv = dev_get_drvdata(d);
1191 if (priv->error) {
1192 ipw_free_error_log(priv->error);
1193 priv->error = NULL;
710 } 1194 }
1195 return count;
1196}
1197
1198static DEVICE_ATTR(error, S_IRUGO | S_IWUSR, show_error, clear_error);
711 1199
712 return sprintf(buf, "UNKNOWN\n"); 1200static ssize_t show_cmd_log(struct device *d,
1201 struct device_attribute *attr, char *buf)
1202{
1203 struct ipw_priv *priv = dev_get_drvdata(d);
1204 u32 len = 0, i;
1205 if (!priv->cmdlog)
1206 return 0;
1207 for (i = (priv->cmdlog_pos + 1) % priv->cmdlog_len;
1208 (i != priv->cmdlog_pos) && (PAGE_SIZE - len);
1209 i = (i + 1) % priv->cmdlog_len) {
1210 len +=
1211 snprintf(buf + len, PAGE_SIZE - len,
1212 "\n%08lX%08X%08X%08X\n", priv->cmdlog[i].jiffies,
1213 priv->cmdlog[i].retcode, priv->cmdlog[i].cmd.cmd,
1214 priv->cmdlog[i].cmd.len);
1215 len +=
1216 snprintk_buf(buf + len, PAGE_SIZE - len,
1217 (u8 *) priv->cmdlog[i].cmd.param,
1218 priv->cmdlog[i].cmd.len);
1219 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1220 }
1221 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1222 return len;
713} 1223}
714 1224
715static DEVICE_ATTR(nic_type, S_IRUGO, show_nic_type, NULL); 1225static DEVICE_ATTR(cmd_log, S_IRUGO, show_cmd_log, NULL);
716 1226
717static ssize_t dump_error_log(struct device *d, 1227static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
718 struct device_attribute *attr, const char *buf, 1228 char *buf)
719 size_t count)
720{ 1229{
721 char *p = (char *)buf; 1230 struct ipw_priv *priv = dev_get_drvdata(d);
1231 return sprintf(buf, "%d\n", priv->ieee->scan_age);
1232}
722 1233
723 if (p[0] == '1') 1234static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
724 ipw_dump_nic_error_log((struct ipw_priv *)d->driver_data); 1235 const char *buf, size_t count)
1236{
1237 struct ipw_priv *priv = dev_get_drvdata(d);
1238#ifdef CONFIG_IPW_DEBUG
1239 struct net_device *dev = priv->net_dev;
1240#endif
1241 char buffer[] = "00000000";
1242 unsigned long len =
1243 (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
1244 unsigned long val;
1245 char *p = buffer;
725 1246
726 return strnlen(buf, count); 1247 IPW_DEBUG_INFO("enter\n");
1248
1249 strncpy(buffer, buf, len);
1250 buffer[len] = 0;
1251
1252 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
1253 p++;
1254 if (p[0] == 'x' || p[0] == 'X')
1255 p++;
1256 val = simple_strtoul(p, &p, 16);
1257 } else
1258 val = simple_strtoul(p, &p, 10);
1259 if (p == buffer) {
1260 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
1261 } else {
1262 priv->ieee->scan_age = val;
1263 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
1264 }
1265
1266 IPW_DEBUG_INFO("exit\n");
1267 return len;
727} 1268}
728 1269
729static DEVICE_ATTR(dump_errors, S_IWUSR, NULL, dump_error_log); 1270static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
730 1271
731static ssize_t dump_event_log(struct device *d, 1272static ssize_t show_led(struct device *d, struct device_attribute *attr,
732 struct device_attribute *attr, const char *buf, 1273 char *buf)
733 size_t count)
734{ 1274{
735 char *p = (char *)buf; 1275 struct ipw_priv *priv = dev_get_drvdata(d);
1276 return sprintf(buf, "%d\n", (priv->config & CFG_NO_LED) ? 0 : 1);
1277}
736 1278
737 if (p[0] == '1') 1279static ssize_t store_led(struct device *d, struct device_attribute *attr,
738 ipw_dump_nic_event_log((struct ipw_priv *)d->driver_data); 1280 const char *buf, size_t count)
1281{
1282 struct ipw_priv *priv = dev_get_drvdata(d);
739 1283
740 return strnlen(buf, count); 1284 IPW_DEBUG_INFO("enter\n");
1285
1286 if (count == 0)
1287 return 0;
1288
1289 if (*buf == 0) {
1290 IPW_DEBUG_LED("Disabling LED control.\n");
1291 priv->config |= CFG_NO_LED;
1292 ipw_led_shutdown(priv);
1293 } else {
1294 IPW_DEBUG_LED("Enabling LED control.\n");
1295 priv->config &= ~CFG_NO_LED;
1296 ipw_led_init(priv);
1297 }
1298
1299 IPW_DEBUG_INFO("exit\n");
1300 return count;
1301}
1302
1303static DEVICE_ATTR(led, S_IWUSR | S_IRUGO, show_led, store_led);
1304
1305static ssize_t show_status(struct device *d,
1306 struct device_attribute *attr, char *buf)
1307{
1308 struct ipw_priv *p = d->driver_data;
1309 return sprintf(buf, "0x%08x\n", (int)p->status);
741} 1310}
742 1311
743static DEVICE_ATTR(dump_events, S_IWUSR, NULL, dump_event_log); 1312static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
1313
1314static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
1315 char *buf)
1316{
1317 struct ipw_priv *p = d->driver_data;
1318 return sprintf(buf, "0x%08x\n", (int)p->config);
1319}
1320
1321static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
1322
1323static ssize_t show_nic_type(struct device *d,
1324 struct device_attribute *attr, char *buf)
1325{
1326 struct ipw_priv *priv = d->driver_data;
1327 return sprintf(buf, "TYPE: %d\n", priv->nic_type);
1328}
1329
1330static DEVICE_ATTR(nic_type, S_IRUGO, show_nic_type, NULL);
744 1331
745static ssize_t show_ucode_version(struct device *d, 1332static ssize_t show_ucode_version(struct device *d,
746 struct device_attribute *attr, char *buf) 1333 struct device_attribute *attr, char *buf)
@@ -798,7 +1385,7 @@ static ssize_t show_command_event_reg(struct device *d,
798 u32 reg = 0; 1385 u32 reg = 0;
799 struct ipw_priv *p = d->driver_data; 1386 struct ipw_priv *p = d->driver_data;
800 1387
801 reg = ipw_read_reg32(p, CX2_INTERNAL_CMD_EVENT); 1388 reg = ipw_read_reg32(p, IPW_INTERNAL_CMD_EVENT);
802 return sprintf(buf, "0x%08x\n", reg); 1389 return sprintf(buf, "0x%08x\n", reg);
803} 1390}
804static ssize_t store_command_event_reg(struct device *d, 1391static ssize_t store_command_event_reg(struct device *d,
@@ -809,7 +1396,7 @@ static ssize_t store_command_event_reg(struct device *d,
809 struct ipw_priv *p = d->driver_data; 1396 struct ipw_priv *p = d->driver_data;
810 1397
811 sscanf(buf, "%x", &reg); 1398 sscanf(buf, "%x", &reg);
812 ipw_write_reg32(p, CX2_INTERNAL_CMD_EVENT, reg); 1399 ipw_write_reg32(p, IPW_INTERNAL_CMD_EVENT, reg);
813 return strnlen(buf, count); 1400 return strnlen(buf, count);
814} 1401}
815 1402
@@ -845,6 +1432,7 @@ static ssize_t show_indirect_dword(struct device *d,
845{ 1432{
846 u32 reg = 0; 1433 u32 reg = 0;
847 struct ipw_priv *priv = d->driver_data; 1434 struct ipw_priv *priv = d->driver_data;
1435
848 if (priv->status & STATUS_INDIRECT_DWORD) 1436 if (priv->status & STATUS_INDIRECT_DWORD)
849 reg = ipw_read_reg32(priv, priv->indirect_dword); 1437 reg = ipw_read_reg32(priv, priv->indirect_dword);
850 else 1438 else
@@ -871,6 +1459,7 @@ static ssize_t show_indirect_byte(struct device *d,
871{ 1459{
872 u8 reg = 0; 1460 u8 reg = 0;
873 struct ipw_priv *priv = d->driver_data; 1461 struct ipw_priv *priv = d->driver_data;
1462
874 if (priv->status & STATUS_INDIRECT_BYTE) 1463 if (priv->status & STATUS_INDIRECT_BYTE)
875 reg = ipw_read_reg8(priv, priv->indirect_byte); 1464 reg = ipw_read_reg8(priv, priv->indirect_byte);
876 else 1465 else
@@ -945,7 +1534,7 @@ static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
945static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio) 1534static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio)
946{ 1535{
947 if ((disable_radio ? 1 : 0) == 1536 if ((disable_radio ? 1 : 0) ==
948 (priv->status & STATUS_RF_KILL_SW ? 1 : 0)) 1537 ((priv->status & STATUS_RF_KILL_SW) ? 1 : 0))
949 return 0; 1538 return 0;
950 1539
951 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n", 1540 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
@@ -954,10 +1543,8 @@ static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio)
954 if (disable_radio) { 1543 if (disable_radio) {
955 priv->status |= STATUS_RF_KILL_SW; 1544 priv->status |= STATUS_RF_KILL_SW;
956 1545
957 if (priv->workqueue) { 1546 if (priv->workqueue)
958 cancel_delayed_work(&priv->request_scan); 1547 cancel_delayed_work(&priv->request_scan);
959 }
960 wake_up_interruptible(&priv->wait_command_queue);
961 queue_work(priv->workqueue, &priv->down); 1548 queue_work(priv->workqueue, &priv->down);
962 } else { 1549 } else {
963 priv->status &= ~STATUS_RF_KILL_SW; 1550 priv->status &= ~STATUS_RF_KILL_SW;
@@ -987,6 +1574,93 @@ static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
987 1574
988static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill); 1575static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
989 1576
1577static ssize_t show_speed_scan(struct device *d, struct device_attribute *attr,
1578 char *buf)
1579{
1580 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1581 int pos = 0, len = 0;
1582 if (priv->config & CFG_SPEED_SCAN) {
1583 while (priv->speed_scan[pos] != 0)
1584 len += sprintf(&buf[len], "%d ",
1585 priv->speed_scan[pos++]);
1586 return len + sprintf(&buf[len], "\n");
1587 }
1588
1589 return sprintf(buf, "0\n");
1590}
1591
1592static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr,
1593 const char *buf, size_t count)
1594{
1595 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1596 int channel, pos = 0;
1597 const char *p = buf;
1598
1599 /* list of space separated channels to scan, optionally ending with 0 */
1600 while ((channel = simple_strtol(p, NULL, 0))) {
1601 if (pos == MAX_SPEED_SCAN - 1) {
1602 priv->speed_scan[pos] = 0;
1603 break;
1604 }
1605
1606 if (ipw_is_valid_channel(priv->ieee, channel))
1607 priv->speed_scan[pos++] = channel;
1608 else
1609 IPW_WARNING("Skipping invalid channel request: %d\n",
1610 channel);
1611 p = strchr(p, ' ');
1612 if (!p)
1613 break;
1614 while (*p == ' ' || *p == '\t')
1615 p++;
1616 }
1617
1618 if (pos == 0)
1619 priv->config &= ~CFG_SPEED_SCAN;
1620 else {
1621 priv->speed_scan_pos = 0;
1622 priv->config |= CFG_SPEED_SCAN;
1623 }
1624
1625 return count;
1626}
1627
1628static DEVICE_ATTR(speed_scan, S_IWUSR | S_IRUGO, show_speed_scan,
1629 store_speed_scan);
1630
1631static ssize_t show_net_stats(struct device *d, struct device_attribute *attr,
1632 char *buf)
1633{
1634 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1635 return sprintf(buf, "%c\n", (priv->config & CFG_NET_STATS) ? '1' : '0');
1636}
1637
1638static ssize_t store_net_stats(struct device *d, struct device_attribute *attr,
1639 const char *buf, size_t count)
1640{
1641 struct ipw_priv *priv = (struct ipw_priv *)d->driver_data;
1642 if (buf[0] == '1')
1643 priv->config |= CFG_NET_STATS;
1644 else
1645 priv->config &= ~CFG_NET_STATS;
1646
1647 return count;
1648}
1649
1650static DEVICE_ATTR(net_stats, S_IWUSR | S_IRUGO,
1651 show_net_stats, store_net_stats);
1652
1653static void notify_wx_assoc_event(struct ipw_priv *priv)
1654{
1655 union iwreq_data wrqu;
1656 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1657 if (priv->status & STATUS_ASSOCIATED)
1658 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
1659 else
1660 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
1661 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1662}
1663
990static void ipw_irq_tasklet(struct ipw_priv *priv) 1664static void ipw_irq_tasklet(struct ipw_priv *priv)
991{ 1665{
992 u32 inta, inta_mask, handled = 0; 1666 u32 inta, inta_mask, handled = 0;
@@ -995,102 +1669,135 @@ static void ipw_irq_tasklet(struct ipw_priv *priv)
995 1669
996 spin_lock_irqsave(&priv->lock, flags); 1670 spin_lock_irqsave(&priv->lock, flags);
997 1671
998 inta = ipw_read32(priv, CX2_INTA_RW); 1672 inta = ipw_read32(priv, IPW_INTA_RW);
999 inta_mask = ipw_read32(priv, CX2_INTA_MASK_R); 1673 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
1000 inta &= (CX2_INTA_MASK_ALL & inta_mask); 1674 inta &= (IPW_INTA_MASK_ALL & inta_mask);
1001 1675
1002 /* Add any cached INTA values that need to be handled */ 1676 /* Add any cached INTA values that need to be handled */
1003 inta |= priv->isr_inta; 1677 inta |= priv->isr_inta;
1004 1678
1005 /* handle all the justifications for the interrupt */ 1679 /* handle all the justifications for the interrupt */
1006 if (inta & CX2_INTA_BIT_RX_TRANSFER) { 1680 if (inta & IPW_INTA_BIT_RX_TRANSFER) {
1007 ipw_rx(priv); 1681 ipw_rx(priv);
1008 handled |= CX2_INTA_BIT_RX_TRANSFER; 1682 handled |= IPW_INTA_BIT_RX_TRANSFER;
1009 } 1683 }
1010 1684
1011 if (inta & CX2_INTA_BIT_TX_CMD_QUEUE) { 1685 if (inta & IPW_INTA_BIT_TX_CMD_QUEUE) {
1012 IPW_DEBUG_HC("Command completed.\n"); 1686 IPW_DEBUG_HC("Command completed.\n");
1013 rc = ipw_queue_tx_reclaim(priv, &priv->txq_cmd, -1); 1687 rc = ipw_queue_tx_reclaim(priv, &priv->txq_cmd, -1);
1014 priv->status &= ~STATUS_HCMD_ACTIVE; 1688 priv->status &= ~STATUS_HCMD_ACTIVE;
1015 wake_up_interruptible(&priv->wait_command_queue); 1689 wake_up_interruptible(&priv->wait_command_queue);
1016 handled |= CX2_INTA_BIT_TX_CMD_QUEUE; 1690 handled |= IPW_INTA_BIT_TX_CMD_QUEUE;
1017 } 1691 }
1018 1692
1019 if (inta & CX2_INTA_BIT_TX_QUEUE_1) { 1693 if (inta & IPW_INTA_BIT_TX_QUEUE_1) {
1020 IPW_DEBUG_TX("TX_QUEUE_1\n"); 1694 IPW_DEBUG_TX("TX_QUEUE_1\n");
1021 rc = ipw_queue_tx_reclaim(priv, &priv->txq[0], 0); 1695 rc = ipw_queue_tx_reclaim(priv, &priv->txq[0], 0);
1022 handled |= CX2_INTA_BIT_TX_QUEUE_1; 1696 handled |= IPW_INTA_BIT_TX_QUEUE_1;
1023 } 1697 }
1024 1698
1025 if (inta & CX2_INTA_BIT_TX_QUEUE_2) { 1699 if (inta & IPW_INTA_BIT_TX_QUEUE_2) {
1026 IPW_DEBUG_TX("TX_QUEUE_2\n"); 1700 IPW_DEBUG_TX("TX_QUEUE_2\n");
1027 rc = ipw_queue_tx_reclaim(priv, &priv->txq[1], 1); 1701 rc = ipw_queue_tx_reclaim(priv, &priv->txq[1], 1);
1028 handled |= CX2_INTA_BIT_TX_QUEUE_2; 1702 handled |= IPW_INTA_BIT_TX_QUEUE_2;
1029 } 1703 }
1030 1704
1031 if (inta & CX2_INTA_BIT_TX_QUEUE_3) { 1705 if (inta & IPW_INTA_BIT_TX_QUEUE_3) {
1032 IPW_DEBUG_TX("TX_QUEUE_3\n"); 1706 IPW_DEBUG_TX("TX_QUEUE_3\n");
1033 rc = ipw_queue_tx_reclaim(priv, &priv->txq[2], 2); 1707 rc = ipw_queue_tx_reclaim(priv, &priv->txq[2], 2);
1034 handled |= CX2_INTA_BIT_TX_QUEUE_3; 1708 handled |= IPW_INTA_BIT_TX_QUEUE_3;
1035 } 1709 }
1036 1710
1037 if (inta & CX2_INTA_BIT_TX_QUEUE_4) { 1711 if (inta & IPW_INTA_BIT_TX_QUEUE_4) {
1038 IPW_DEBUG_TX("TX_QUEUE_4\n"); 1712 IPW_DEBUG_TX("TX_QUEUE_4\n");
1039 rc = ipw_queue_tx_reclaim(priv, &priv->txq[3], 3); 1713 rc = ipw_queue_tx_reclaim(priv, &priv->txq[3], 3);
1040 handled |= CX2_INTA_BIT_TX_QUEUE_4; 1714 handled |= IPW_INTA_BIT_TX_QUEUE_4;
1041 } 1715 }
1042 1716
1043 if (inta & CX2_INTA_BIT_STATUS_CHANGE) { 1717 if (inta & IPW_INTA_BIT_STATUS_CHANGE) {
1044 IPW_WARNING("STATUS_CHANGE\n"); 1718 IPW_WARNING("STATUS_CHANGE\n");
1045 handled |= CX2_INTA_BIT_STATUS_CHANGE; 1719 handled |= IPW_INTA_BIT_STATUS_CHANGE;
1046 } 1720 }
1047 1721
1048 if (inta & CX2_INTA_BIT_BEACON_PERIOD_EXPIRED) { 1722 if (inta & IPW_INTA_BIT_BEACON_PERIOD_EXPIRED) {
1049 IPW_WARNING("TX_PERIOD_EXPIRED\n"); 1723 IPW_WARNING("TX_PERIOD_EXPIRED\n");
1050 handled |= CX2_INTA_BIT_BEACON_PERIOD_EXPIRED; 1724 handled |= IPW_INTA_BIT_BEACON_PERIOD_EXPIRED;
1051 } 1725 }
1052 1726
1053 if (inta & CX2_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE) { 1727 if (inta & IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE) {
1054 IPW_WARNING("HOST_CMD_DONE\n"); 1728 IPW_WARNING("HOST_CMD_DONE\n");
1055 handled |= CX2_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE; 1729 handled |= IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE;
1056 } 1730 }
1057 1731
1058 if (inta & CX2_INTA_BIT_FW_INITIALIZATION_DONE) { 1732 if (inta & IPW_INTA_BIT_FW_INITIALIZATION_DONE) {
1059 IPW_WARNING("FW_INITIALIZATION_DONE\n"); 1733 IPW_WARNING("FW_INITIALIZATION_DONE\n");
1060 handled |= CX2_INTA_BIT_FW_INITIALIZATION_DONE; 1734 handled |= IPW_INTA_BIT_FW_INITIALIZATION_DONE;
1061 } 1735 }
1062 1736
1063 if (inta & CX2_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE) { 1737 if (inta & IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE) {
1064 IPW_WARNING("PHY_OFF_DONE\n"); 1738 IPW_WARNING("PHY_OFF_DONE\n");
1065 handled |= CX2_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE; 1739 handled |= IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE;
1066 } 1740 }
1067 1741
1068 if (inta & CX2_INTA_BIT_RF_KILL_DONE) { 1742 if (inta & IPW_INTA_BIT_RF_KILL_DONE) {
1069 IPW_DEBUG_RF_KILL("RF_KILL_DONE\n"); 1743 IPW_DEBUG_RF_KILL("RF_KILL_DONE\n");
1070 priv->status |= STATUS_RF_KILL_HW; 1744 priv->status |= STATUS_RF_KILL_HW;
1071 wake_up_interruptible(&priv->wait_command_queue); 1745 wake_up_interruptible(&priv->wait_command_queue);
1072 netif_carrier_off(priv->net_dev); 1746 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1073 netif_stop_queue(priv->net_dev);
1074 cancel_delayed_work(&priv->request_scan); 1747 cancel_delayed_work(&priv->request_scan);
1748 schedule_work(&priv->link_down);
1075 queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ); 1749 queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ);
1076 handled |= CX2_INTA_BIT_RF_KILL_DONE; 1750 handled |= IPW_INTA_BIT_RF_KILL_DONE;
1077 } 1751 }
1078 1752
1079 if (inta & CX2_INTA_BIT_FATAL_ERROR) { 1753 if (inta & IPW_INTA_BIT_FATAL_ERROR) {
1080 IPW_ERROR("Firmware error detected. Restarting.\n"); 1754 IPW_ERROR("Firmware error detected. Restarting.\n");
1755 if (priv->error) {
1756 IPW_ERROR("Sysfs 'error' log already exists.\n");
1081#ifdef CONFIG_IPW_DEBUG 1757#ifdef CONFIG_IPW_DEBUG
1082 if (ipw_debug_level & IPW_DL_FW_ERRORS) { 1758 if (ipw_debug_level & IPW_DL_FW_ERRORS) {
1083 ipw_dump_nic_error_log(priv); 1759 struct ipw_fw_error *error =
1084 ipw_dump_nic_event_log(priv); 1760 ipw_alloc_error_log(priv);
1085 } 1761 ipw_dump_error_log(priv, error);
1762 if (error)
1763 ipw_free_error_log(error);
1764 }
1086#endif 1765#endif
1766 } else {
1767 priv->error = ipw_alloc_error_log(priv);
1768 if (priv->error)
1769 IPW_ERROR("Sysfs 'error' log captured.\n");
1770 else
1771 IPW_ERROR("Error allocating sysfs 'error' "
1772 "log.\n");
1773#ifdef CONFIG_IPW_DEBUG
1774 if (ipw_debug_level & IPW_DL_FW_ERRORS)
1775 ipw_dump_error_log(priv, priv->error);
1776#endif
1777 }
1778
1779 /* XXX: If hardware encryption is for WPA/WPA2,
1780 * we have to notify the supplicant. */
1781 if (priv->ieee->sec.encrypt) {
1782 priv->status &= ~STATUS_ASSOCIATED;
1783 notify_wx_assoc_event(priv);
1784 }
1785
1786 /* Keep the restart process from trying to send host
1787 * commands by clearing the INIT status bit */
1788 priv->status &= ~STATUS_INIT;
1789
1790 /* Cancel currently queued command. */
1791 priv->status &= ~STATUS_HCMD_ACTIVE;
1792 wake_up_interruptible(&priv->wait_command_queue);
1793
1087 queue_work(priv->workqueue, &priv->adapter_restart); 1794 queue_work(priv->workqueue, &priv->adapter_restart);
1088 handled |= CX2_INTA_BIT_FATAL_ERROR; 1795 handled |= IPW_INTA_BIT_FATAL_ERROR;
1089 } 1796 }
1090 1797
1091 if (inta & CX2_INTA_BIT_PARITY_ERROR) { 1798 if (inta & IPW_INTA_BIT_PARITY_ERROR) {
1092 IPW_ERROR("Parity error\n"); 1799 IPW_ERROR("Parity error\n");
1093 handled |= CX2_INTA_BIT_PARITY_ERROR; 1800 handled |= IPW_INTA_BIT_PARITY_ERROR;
1094 } 1801 }
1095 1802
1096 if (handled != inta) { 1803 if (handled != inta) {
@@ -1103,7 +1810,6 @@ static void ipw_irq_tasklet(struct ipw_priv *priv)
1103 spin_unlock_irqrestore(&priv->lock, flags); 1810 spin_unlock_irqrestore(&priv->lock, flags);
1104} 1811}
1105 1812
1106#ifdef CONFIG_IPW_DEBUG
1107#define IPW_CMD(x) case IPW_CMD_ ## x : return #x 1813#define IPW_CMD(x) case IPW_CMD_ ## x : return #x
1108static char *get_cmd_string(u8 cmd) 1814static char *get_cmd_string(u8 cmd)
1109{ 1815{
@@ -1162,44 +1868,78 @@ static char *get_cmd_string(u8 cmd)
1162 return "UNKNOWN"; 1868 return "UNKNOWN";
1163 } 1869 }
1164} 1870}
1165#endif /* CONFIG_IPW_DEBUG */
1166 1871
1167#define HOST_COMPLETE_TIMEOUT HZ 1872#define HOST_COMPLETE_TIMEOUT HZ
1168static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) 1873static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd)
1169{ 1874{
1170 int rc = 0; 1875 int rc = 0;
1876 unsigned long flags;
1171 1877
1878 spin_lock_irqsave(&priv->lock, flags);
1172 if (priv->status & STATUS_HCMD_ACTIVE) { 1879 if (priv->status & STATUS_HCMD_ACTIVE) {
1173 IPW_ERROR("Already sending a command\n"); 1880 IPW_ERROR("Failed to send %s: Already sending a command.\n",
1174 return -1; 1881 get_cmd_string(cmd->cmd));
1882 spin_unlock_irqrestore(&priv->lock, flags);
1883 return -EAGAIN;
1175 } 1884 }
1176 1885
1177 priv->status |= STATUS_HCMD_ACTIVE; 1886 priv->status |= STATUS_HCMD_ACTIVE;
1178 1887
1179 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n", 1888 if (priv->cmdlog) {
1180 get_cmd_string(cmd->cmd), cmd->cmd, cmd->len); 1889 priv->cmdlog[priv->cmdlog_pos].jiffies = jiffies;
1890 priv->cmdlog[priv->cmdlog_pos].cmd.cmd = cmd->cmd;
1891 priv->cmdlog[priv->cmdlog_pos].cmd.len = cmd->len;
1892 memcpy(priv->cmdlog[priv->cmdlog_pos].cmd.param, cmd->param,
1893 cmd->len);
1894 priv->cmdlog[priv->cmdlog_pos].retcode = -1;
1895 }
1896
1897 IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n",
1898 get_cmd_string(cmd->cmd), cmd->cmd, cmd->len,
1899 priv->status);
1181 printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len); 1900 printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len);
1182 1901
1183 rc = ipw_queue_tx_hcmd(priv, cmd->cmd, &cmd->param, cmd->len, 0); 1902 rc = ipw_queue_tx_hcmd(priv, cmd->cmd, &cmd->param, cmd->len, 0);
1184 if (rc) 1903 if (rc) {
1185 return rc; 1904 priv->status &= ~STATUS_HCMD_ACTIVE;
1905 IPW_ERROR("Failed to send %s: Reason %d\n",
1906 get_cmd_string(cmd->cmd), rc);
1907 spin_unlock_irqrestore(&priv->lock, flags);
1908 goto exit;
1909 }
1910 spin_unlock_irqrestore(&priv->lock, flags);
1186 1911
1187 rc = wait_event_interruptible_timeout(priv->wait_command_queue, 1912 rc = wait_event_interruptible_timeout(priv->wait_command_queue,
1188 !(priv-> 1913 !(priv->
1189 status & STATUS_HCMD_ACTIVE), 1914 status & STATUS_HCMD_ACTIVE),
1190 HOST_COMPLETE_TIMEOUT); 1915 HOST_COMPLETE_TIMEOUT);
1191 if (rc == 0) { 1916 if (rc == 0) {
1192 IPW_DEBUG_INFO("Command completion failed out after %dms.\n", 1917 spin_lock_irqsave(&priv->lock, flags);
1193 jiffies_to_msecs(HOST_COMPLETE_TIMEOUT)); 1918 if (priv->status & STATUS_HCMD_ACTIVE) {
1194 priv->status &= ~STATUS_HCMD_ACTIVE; 1919 IPW_ERROR("Failed to send %s: Command timed out.\n",
1195 return -EIO; 1920 get_cmd_string(cmd->cmd));
1196 } 1921 priv->status &= ~STATUS_HCMD_ACTIVE;
1197 if (priv->status & STATUS_RF_KILL_MASK) { 1922 spin_unlock_irqrestore(&priv->lock, flags);
1198 IPW_DEBUG_INFO("Command aborted due to RF Kill Switch\n"); 1923 rc = -EIO;
1199 return -EIO; 1924 goto exit;
1925 }
1926 spin_unlock_irqrestore(&priv->lock, flags);
1927 } else
1928 rc = 0;
1929
1930 if (priv->status & STATUS_RF_KILL_HW) {
1931 IPW_ERROR("Failed to send %s: Aborted due to RF kill switch.\n",
1932 get_cmd_string(cmd->cmd));
1933 rc = -EIO;
1934 goto exit;
1200 } 1935 }
1201 1936
1202 return 0; 1937 exit:
1938 if (priv->cmdlog) {
1939 priv->cmdlog[priv->cmdlog_pos++].retcode = rc;
1940 priv->cmdlog_pos %= priv->cmdlog_len;
1941 }
1942 return rc;
1203} 1943}
1204 1944
1205static int ipw_send_host_complete(struct ipw_priv *priv) 1945static int ipw_send_host_complete(struct ipw_priv *priv)
@@ -1214,12 +1954,7 @@ static int ipw_send_host_complete(struct ipw_priv *priv)
1214 return -1; 1954 return -1;
1215 } 1955 }
1216 1956
1217 if (ipw_send_cmd(priv, &cmd)) { 1957 return ipw_send_cmd(priv, &cmd);
1218 IPW_ERROR("failed to send HOST_COMPLETE command\n");
1219 return -1;
1220 }
1221
1222 return 0;
1223} 1958}
1224 1959
1225static int ipw_send_system_config(struct ipw_priv *priv, 1960static int ipw_send_system_config(struct ipw_priv *priv,
@@ -1235,13 +1970,8 @@ static int ipw_send_system_config(struct ipw_priv *priv,
1235 return -1; 1970 return -1;
1236 } 1971 }
1237 1972
1238 memcpy(&cmd.param, config, sizeof(*config)); 1973 memcpy(cmd.param, config, sizeof(*config));
1239 if (ipw_send_cmd(priv, &cmd)) { 1974 return ipw_send_cmd(priv, &cmd);
1240 IPW_ERROR("failed to send SYSTEM_CONFIG command\n");
1241 return -1;
1242 }
1243
1244 return 0;
1245} 1975}
1246 1976
1247static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) 1977static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len)
@@ -1256,13 +1986,8 @@ static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len)
1256 return -1; 1986 return -1;
1257 } 1987 }
1258 1988
1259 memcpy(&cmd.param, ssid, cmd.len); 1989 memcpy(cmd.param, ssid, cmd.len);
1260 if (ipw_send_cmd(priv, &cmd)) { 1990 return ipw_send_cmd(priv, &cmd);
1261 IPW_ERROR("failed to send SSID command\n");
1262 return -1;
1263 }
1264
1265 return 0;
1266} 1991}
1267 1992
1268static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) 1993static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac)
@@ -1280,16 +2005,15 @@ static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac)
1280 IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n", 2005 IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n",
1281 priv->net_dev->name, MAC_ARG(mac)); 2006 priv->net_dev->name, MAC_ARG(mac));
1282 2007
1283 memcpy(&cmd.param, mac, ETH_ALEN); 2008 memcpy(cmd.param, mac, ETH_ALEN);
1284 2009 return ipw_send_cmd(priv, &cmd);
1285 if (ipw_send_cmd(priv, &cmd)) {
1286 IPW_ERROR("failed to send ADAPTER_ADDRESS command\n");
1287 return -1;
1288 }
1289
1290 return 0;
1291} 2010}
1292 2011
2012/*
2013 * NOTE: This must be executed from our workqueue as it results in udelay
2014 * being called which may corrupt the keyboard if executed on default
2015 * workqueue
2016 */
1293static void ipw_adapter_restart(void *adapter) 2017static void ipw_adapter_restart(void *adapter)
1294{ 2018{
1295 struct ipw_priv *priv = adapter; 2019 struct ipw_priv *priv = adapter;
@@ -1298,12 +2022,25 @@ static void ipw_adapter_restart(void *adapter)
1298 return; 2022 return;
1299 2023
1300 ipw_down(priv); 2024 ipw_down(priv);
2025
2026 if (priv->assoc_network &&
2027 (priv->assoc_network->capability & WLAN_CAPABILITY_IBSS))
2028 ipw_remove_current_network(priv);
2029
1301 if (ipw_up(priv)) { 2030 if (ipw_up(priv)) {
1302 IPW_ERROR("Failed to up device\n"); 2031 IPW_ERROR("Failed to up device\n");
1303 return; 2032 return;
1304 } 2033 }
1305} 2034}
1306 2035
2036static void ipw_bg_adapter_restart(void *data)
2037{
2038 struct ipw_priv *priv = data;
2039 down(&priv->sem);
2040 ipw_adapter_restart(data);
2041 up(&priv->sem);
2042}
2043
1307#define IPW_SCAN_CHECK_WATCHDOG (5 * HZ) 2044#define IPW_SCAN_CHECK_WATCHDOG (5 * HZ)
1308 2045
1309static void ipw_scan_check(void *data) 2046static void ipw_scan_check(void *data)
@@ -1313,10 +2050,18 @@ static void ipw_scan_check(void *data)
1313 IPW_DEBUG_SCAN("Scan completion watchdog resetting " 2050 IPW_DEBUG_SCAN("Scan completion watchdog resetting "
1314 "adapter (%dms).\n", 2051 "adapter (%dms).\n",
1315 IPW_SCAN_CHECK_WATCHDOG / 100); 2052 IPW_SCAN_CHECK_WATCHDOG / 100);
1316 ipw_adapter_restart(priv); 2053 queue_work(priv->workqueue, &priv->adapter_restart);
1317 } 2054 }
1318} 2055}
1319 2056
2057static void ipw_bg_scan_check(void *data)
2058{
2059 struct ipw_priv *priv = data;
2060 down(&priv->sem);
2061 ipw_scan_check(data);
2062 up(&priv->sem);
2063}
2064
1320static int ipw_send_scan_request_ext(struct ipw_priv *priv, 2065static int ipw_send_scan_request_ext(struct ipw_priv *priv,
1321 struct ipw_scan_request_ext *request) 2066 struct ipw_scan_request_ext *request)
1322{ 2067{
@@ -1325,20 +2070,8 @@ static int ipw_send_scan_request_ext(struct ipw_priv *priv,
1325 .len = sizeof(*request) 2070 .len = sizeof(*request)
1326 }; 2071 };
1327 2072
1328 if (!priv || !request) { 2073 memcpy(cmd.param, request, sizeof(*request));
1329 IPW_ERROR("Invalid args\n"); 2074 return ipw_send_cmd(priv, &cmd);
1330 return -1;
1331 }
1332
1333 memcpy(&cmd.param, request, sizeof(*request));
1334 if (ipw_send_cmd(priv, &cmd)) {
1335 IPW_ERROR("failed to send SCAN_REQUEST_EXT command\n");
1336 return -1;
1337 }
1338
1339 queue_delayed_work(priv->workqueue, &priv->scan_check,
1340 IPW_SCAN_CHECK_WATCHDOG);
1341 return 0;
1342} 2075}
1343 2076
1344static int ipw_send_scan_abort(struct ipw_priv *priv) 2077static int ipw_send_scan_abort(struct ipw_priv *priv)
@@ -1353,12 +2086,7 @@ static int ipw_send_scan_abort(struct ipw_priv *priv)
1353 return -1; 2086 return -1;
1354 } 2087 }
1355 2088
1356 if (ipw_send_cmd(priv, &cmd)) { 2089 return ipw_send_cmd(priv, &cmd);
1357 IPW_ERROR("failed to send SCAN_ABORT command\n");
1358 return -1;
1359 }
1360
1361 return 0;
1362} 2090}
1363 2091
1364static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens) 2092static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens)
@@ -1370,12 +2098,7 @@ static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens)
1370 struct ipw_sensitivity_calib *calib = (struct ipw_sensitivity_calib *) 2098 struct ipw_sensitivity_calib *calib = (struct ipw_sensitivity_calib *)
1371 &cmd.param; 2099 &cmd.param;
1372 calib->beacon_rssi_raw = sens; 2100 calib->beacon_rssi_raw = sens;
1373 if (ipw_send_cmd(priv, &cmd)) { 2101 return ipw_send_cmd(priv, &cmd);
1374 IPW_ERROR("failed to send SENSITIVITY CALIB command\n");
1375 return -1;
1376 }
1377
1378 return 0;
1379} 2102}
1380 2103
1381static int ipw_send_associate(struct ipw_priv *priv, 2104static int ipw_send_associate(struct ipw_priv *priv,
@@ -1386,18 +2109,26 @@ static int ipw_send_associate(struct ipw_priv *priv,
1386 .len = sizeof(*associate) 2109 .len = sizeof(*associate)
1387 }; 2110 };
1388 2111
2112 struct ipw_associate tmp_associate;
2113 memcpy(&tmp_associate, associate, sizeof(*associate));
2114 tmp_associate.policy_support =
2115 cpu_to_le16(tmp_associate.policy_support);
2116 tmp_associate.assoc_tsf_msw = cpu_to_le32(tmp_associate.assoc_tsf_msw);
2117 tmp_associate.assoc_tsf_lsw = cpu_to_le32(tmp_associate.assoc_tsf_lsw);
2118 tmp_associate.capability = cpu_to_le16(tmp_associate.capability);
2119 tmp_associate.listen_interval =
2120 cpu_to_le16(tmp_associate.listen_interval);
2121 tmp_associate.beacon_interval =
2122 cpu_to_le16(tmp_associate.beacon_interval);
2123 tmp_associate.atim_window = cpu_to_le16(tmp_associate.atim_window);
2124
1389 if (!priv || !associate) { 2125 if (!priv || !associate) {
1390 IPW_ERROR("Invalid args\n"); 2126 IPW_ERROR("Invalid args\n");
1391 return -1; 2127 return -1;
1392 } 2128 }
1393 2129
1394 memcpy(&cmd.param, associate, sizeof(*associate)); 2130 memcpy(cmd.param, &tmp_associate, sizeof(*associate));
1395 if (ipw_send_cmd(priv, &cmd)) { 2131 return ipw_send_cmd(priv, &cmd);
1396 IPW_ERROR("failed to send ASSOCIATE command\n");
1397 return -1;
1398 }
1399
1400 return 0;
1401} 2132}
1402 2133
1403static int ipw_send_supported_rates(struct ipw_priv *priv, 2134static int ipw_send_supported_rates(struct ipw_priv *priv,
@@ -1413,13 +2144,8 @@ static int ipw_send_supported_rates(struct ipw_priv *priv,
1413 return -1; 2144 return -1;
1414 } 2145 }
1415 2146
1416 memcpy(&cmd.param, rates, sizeof(*rates)); 2147 memcpy(cmd.param, rates, sizeof(*rates));
1417 if (ipw_send_cmd(priv, &cmd)) { 2148 return ipw_send_cmd(priv, &cmd);
1418 IPW_ERROR("failed to send SUPPORTED_RATES command\n");
1419 return -1;
1420 }
1421
1422 return 0;
1423} 2149}
1424 2150
1425static int ipw_set_random_seed(struct ipw_priv *priv) 2151static int ipw_set_random_seed(struct ipw_priv *priv)
@@ -1436,15 +2162,9 @@ static int ipw_set_random_seed(struct ipw_priv *priv)
1436 2162
1437 get_random_bytes(&cmd.param, sizeof(u32)); 2163 get_random_bytes(&cmd.param, sizeof(u32));
1438 2164
1439 if (ipw_send_cmd(priv, &cmd)) { 2165 return ipw_send_cmd(priv, &cmd);
1440 IPW_ERROR("failed to send SEED_NUMBER command\n");
1441 return -1;
1442 }
1443
1444 return 0;
1445} 2166}
1446 2167
1447#if 0
1448static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off) 2168static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off)
1449{ 2169{
1450 struct host_cmd cmd = { 2170 struct host_cmd cmd = {
@@ -1459,14 +2179,8 @@ static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off)
1459 2179
1460 *((u32 *) & cmd.param) = phy_off; 2180 *((u32 *) & cmd.param) = phy_off;
1461 2181
1462 if (ipw_send_cmd(priv, &cmd)) { 2182 return ipw_send_cmd(priv, &cmd);
1463 IPW_ERROR("failed to send CARD_DISABLE command\n");
1464 return -1;
1465 }
1466
1467 return 0;
1468} 2183}
1469#endif
1470 2184
1471static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) 2185static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power)
1472{ 2186{
@@ -1480,12 +2194,51 @@ static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power)
1480 return -1; 2194 return -1;
1481 } 2195 }
1482 2196
1483 memcpy(&cmd.param, power, sizeof(*power)); 2197 memcpy(cmd.param, power, sizeof(*power));
1484 if (ipw_send_cmd(priv, &cmd)) { 2198 return ipw_send_cmd(priv, &cmd);
1485 IPW_ERROR("failed to send TX_POWER command\n"); 2199}
1486 return -1; 2200
2201static int ipw_set_tx_power(struct ipw_priv *priv)
2202{
2203 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
2204 struct ipw_tx_power tx_power;
2205 s8 max_power;
2206 int i;
2207
2208 memset(&tx_power, 0, sizeof(tx_power));
2209
2210 /* configure device for 'G' band */
2211 tx_power.ieee_mode = IPW_G_MODE;
2212 tx_power.num_channels = geo->bg_channels;
2213 for (i = 0; i < geo->bg_channels; i++) {
2214 max_power = geo->bg[i].max_power;
2215 tx_power.channels_tx_power[i].channel_number =
2216 geo->bg[i].channel;
2217 tx_power.channels_tx_power[i].tx_power = max_power ?
2218 min(max_power, priv->tx_power) : priv->tx_power;
1487 } 2219 }
2220 if (ipw_send_tx_power(priv, &tx_power))
2221 return -EIO;
2222
2223 /* configure device to also handle 'B' band */
2224 tx_power.ieee_mode = IPW_B_MODE;
2225 if (ipw_send_tx_power(priv, &tx_power))
2226 return -EIO;
1488 2227
2228 /* configure device to also handle 'A' band */
2229 if (priv->ieee->abg_true) {
2230 tx_power.ieee_mode = IPW_A_MODE;
2231 tx_power.num_channels = geo->a_channels;
2232 for (i = 0; i < tx_power.num_channels; i++) {
2233 max_power = geo->a[i].max_power;
2234 tx_power.channels_tx_power[i].channel_number =
2235 geo->a[i].channel;
2236 tx_power.channels_tx_power[i].tx_power = max_power ?
2237 min(max_power, priv->tx_power) : priv->tx_power;
2238 }
2239 if (ipw_send_tx_power(priv, &tx_power))
2240 return -EIO;
2241 }
1489 return 0; 2242 return 0;
1490} 2243}
1491 2244
@@ -1504,13 +2257,8 @@ static int ipw_send_rts_threshold(struct ipw_priv *priv, u16 rts)
1504 return -1; 2257 return -1;
1505 } 2258 }
1506 2259
1507 memcpy(&cmd.param, &rts_threshold, sizeof(rts_threshold)); 2260 memcpy(cmd.param, &rts_threshold, sizeof(rts_threshold));
1508 if (ipw_send_cmd(priv, &cmd)) { 2261 return ipw_send_cmd(priv, &cmd);
1509 IPW_ERROR("failed to send RTS_THRESHOLD command\n");
1510 return -1;
1511 }
1512
1513 return 0;
1514} 2262}
1515 2263
1516static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) 2264static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag)
@@ -1528,13 +2276,8 @@ static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag)
1528 return -1; 2276 return -1;
1529 } 2277 }
1530 2278
1531 memcpy(&cmd.param, &frag_threshold, sizeof(frag_threshold)); 2279 memcpy(cmd.param, &frag_threshold, sizeof(frag_threshold));
1532 if (ipw_send_cmd(priv, &cmd)) { 2280 return ipw_send_cmd(priv, &cmd);
1533 IPW_ERROR("failed to send FRAG_THRESHOLD command\n");
1534 return -1;
1535 }
1536
1537 return 0;
1538} 2281}
1539 2282
1540static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) 2283static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode)
@@ -1564,12 +2307,27 @@ static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode)
1564 break; 2307 break;
1565 } 2308 }
1566 2309
1567 if (ipw_send_cmd(priv, &cmd)) { 2310 return ipw_send_cmd(priv, &cmd);
1568 IPW_ERROR("failed to send POWER_MODE command\n"); 2311}
2312
2313static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit)
2314{
2315 struct ipw_retry_limit retry_limit = {
2316 .short_retry_limit = slimit,
2317 .long_retry_limit = llimit
2318 };
2319 struct host_cmd cmd = {
2320 .cmd = IPW_CMD_RETRY_LIMIT,
2321 .len = sizeof(retry_limit)
2322 };
2323
2324 if (!priv) {
2325 IPW_ERROR("Invalid args\n");
1569 return -1; 2326 return -1;
1570 } 2327 }
1571 2328
1572 return 0; 2329 memcpy(cmd.param, &retry_limit, sizeof(retry_limit));
2330 return ipw_send_cmd(priv, &cmd);
1573} 2331}
1574 2332
1575/* 2333/*
@@ -1671,8 +2429,7 @@ static u16 eeprom_read_u16(struct ipw_priv *priv, u8 addr)
1671/* data's copy of the eeprom data */ 2429/* data's copy of the eeprom data */
1672static void eeprom_parse_mac(struct ipw_priv *priv, u8 * mac) 2430static void eeprom_parse_mac(struct ipw_priv *priv, u8 * mac)
1673{ 2431{
1674 u8 *ee = (u8 *) priv->eeprom; 2432 memcpy(mac, &priv->eeprom[EEPROM_MAC_ADDRESS], 6);
1675 memcpy(mac, &ee[EEPROM_MAC_ADDRESS], 6);
1676} 2433}
1677 2434
1678/* 2435/*
@@ -1692,7 +2449,7 @@ static void ipw_eeprom_init_sram(struct ipw_priv *priv)
1692 2449
1693 /* read entire contents of eeprom into private buffer */ 2450 /* read entire contents of eeprom into private buffer */
1694 for (i = 0; i < 128; i++) 2451 for (i = 0; i < 128; i++)
1695 eeprom[i] = eeprom_read_u16(priv, (u8) i); 2452 eeprom[i] = le16_to_cpu(eeprom_read_u16(priv, (u8) i));
1696 2453
1697 /* 2454 /*
1698 If the data looks correct, then copy it to our private 2455 If the data looks correct, then copy it to our private
@@ -1703,7 +2460,7 @@ static void ipw_eeprom_init_sram(struct ipw_priv *priv)
1703 IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n"); 2460 IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n");
1704 2461
1705 /* write the eeprom data to sram */ 2462 /* write the eeprom data to sram */
1706 for (i = 0; i < CX2_EEPROM_IMAGE_SIZE; i++) 2463 for (i = 0; i < IPW_EEPROM_IMAGE_SIZE; i++)
1707 ipw_write8(priv, IPW_EEPROM_DATA + i, priv->eeprom[i]); 2464 ipw_write8(priv, IPW_EEPROM_DATA + i, priv->eeprom[i]);
1708 2465
1709 /* Do not load eeprom data on fatal error or suspend */ 2466 /* Do not load eeprom data on fatal error or suspend */
@@ -1723,14 +2480,14 @@ static inline void ipw_zero_memory(struct ipw_priv *priv, u32 start, u32 count)
1723 count >>= 2; 2480 count >>= 2;
1724 if (!count) 2481 if (!count)
1725 return; 2482 return;
1726 _ipw_write32(priv, CX2_AUTOINC_ADDR, start); 2483 _ipw_write32(priv, IPW_AUTOINC_ADDR, start);
1727 while (count--) 2484 while (count--)
1728 _ipw_write32(priv, CX2_AUTOINC_DATA, 0); 2485 _ipw_write32(priv, IPW_AUTOINC_DATA, 0);
1729} 2486}
1730 2487
1731static inline void ipw_fw_dma_reset_command_blocks(struct ipw_priv *priv) 2488static inline void ipw_fw_dma_reset_command_blocks(struct ipw_priv *priv)
1732{ 2489{
1733 ipw_zero_memory(priv, CX2_SHARED_SRAM_DMA_CONTROL, 2490 ipw_zero_memory(priv, IPW_SHARED_SRAM_DMA_CONTROL,
1734 CB_NUMBER_OF_ELEMENTS_SMALL * 2491 CB_NUMBER_OF_ELEMENTS_SMALL *
1735 sizeof(struct command_block)); 2492 sizeof(struct command_block));
1736} 2493}
@@ -1744,7 +2501,7 @@ static int ipw_fw_dma_enable(struct ipw_priv *priv)
1744 ipw_fw_dma_reset_command_blocks(priv); 2501 ipw_fw_dma_reset_command_blocks(priv);
1745 2502
1746 /* Write CB base address */ 2503 /* Write CB base address */
1747 ipw_write_reg32(priv, CX2_DMA_I_CB_BASE, CX2_SHARED_SRAM_DMA_CONTROL); 2504 ipw_write_reg32(priv, IPW_DMA_I_CB_BASE, IPW_SHARED_SRAM_DMA_CONTROL);
1748 2505
1749 IPW_DEBUG_FW("<< : \n"); 2506 IPW_DEBUG_FW("<< : \n");
1750 return 0; 2507 return 0;
@@ -1758,7 +2515,7 @@ static void ipw_fw_dma_abort(struct ipw_priv *priv)
1758 2515
1759 //set the Stop and Abort bit 2516 //set the Stop and Abort bit
1760 control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_STOP_AND_ABORT; 2517 control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_STOP_AND_ABORT;
1761 ipw_write_reg32(priv, CX2_DMA_I_DMA_CONTROL, control); 2518 ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control);
1762 priv->sram_desc.last_cb_index = 0; 2519 priv->sram_desc.last_cb_index = 0;
1763 2520
1764 IPW_DEBUG_FW("<< \n"); 2521 IPW_DEBUG_FW("<< \n");
@@ -1768,7 +2525,7 @@ static int ipw_fw_dma_write_command_block(struct ipw_priv *priv, int index,
1768 struct command_block *cb) 2525 struct command_block *cb)
1769{ 2526{
1770 u32 address = 2527 u32 address =
1771 CX2_SHARED_SRAM_DMA_CONTROL + 2528 IPW_SHARED_SRAM_DMA_CONTROL +
1772 (sizeof(struct command_block) * index); 2529 (sizeof(struct command_block) * index);
1773 IPW_DEBUG_FW(">> :\n"); 2530 IPW_DEBUG_FW(">> :\n");
1774 2531
@@ -1792,13 +2549,13 @@ static int ipw_fw_dma_kick(struct ipw_priv *priv)
1792 &priv->sram_desc.cb_list[index]); 2549 &priv->sram_desc.cb_list[index]);
1793 2550
1794 /* Enable the DMA in the CSR register */ 2551 /* Enable the DMA in the CSR register */
1795 ipw_clear_bit(priv, CX2_RESET_REG, 2552 ipw_clear_bit(priv, IPW_RESET_REG,
1796 CX2_RESET_REG_MASTER_DISABLED | 2553 IPW_RESET_REG_MASTER_DISABLED |
1797 CX2_RESET_REG_STOP_MASTER); 2554 IPW_RESET_REG_STOP_MASTER);
1798 2555
1799 /* Set the Start bit. */ 2556 /* Set the Start bit. */
1800 control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_START; 2557 control = DMA_CONTROL_SMALL_CB_CONST_VALUE | DMA_CB_START;
1801 ipw_write_reg32(priv, CX2_DMA_I_DMA_CONTROL, control); 2558 ipw_write_reg32(priv, IPW_DMA_I_DMA_CONTROL, control);
1802 2559
1803 IPW_DEBUG_FW("<< :\n"); 2560 IPW_DEBUG_FW("<< :\n");
1804 return 0; 2561 return 0;
@@ -1811,12 +2568,12 @@ static void ipw_fw_dma_dump_command_block(struct ipw_priv *priv)
1811 u32 cb_fields_address = 0; 2568 u32 cb_fields_address = 0;
1812 2569
1813 IPW_DEBUG_FW(">> :\n"); 2570 IPW_DEBUG_FW(">> :\n");
1814 address = ipw_read_reg32(priv, CX2_DMA_I_CURRENT_CB); 2571 address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB);
1815 IPW_DEBUG_FW_INFO("Current CB is 0x%x \n", address); 2572 IPW_DEBUG_FW_INFO("Current CB is 0x%x \n", address);
1816 2573
1817 /* Read the DMA Controlor register */ 2574 /* Read the DMA Controlor register */
1818 register_value = ipw_read_reg32(priv, CX2_DMA_I_DMA_CONTROL); 2575 register_value = ipw_read_reg32(priv, IPW_DMA_I_DMA_CONTROL);
1819 IPW_DEBUG_FW_INFO("CX2_DMA_I_DMA_CONTROL is 0x%x \n", register_value); 2576 IPW_DEBUG_FW_INFO("IPW_DMA_I_DMA_CONTROL is 0x%x \n", register_value);
1820 2577
1821 /* Print the CB values */ 2578 /* Print the CB values */
1822 cb_fields_address = address; 2579 cb_fields_address = address;
@@ -1845,9 +2602,9 @@ static int ipw_fw_dma_command_block_index(struct ipw_priv *priv)
1845 u32 current_cb_index = 0; 2602 u32 current_cb_index = 0;
1846 2603
1847 IPW_DEBUG_FW("<< :\n"); 2604 IPW_DEBUG_FW("<< :\n");
1848 current_cb_address = ipw_read_reg32(priv, CX2_DMA_I_CURRENT_CB); 2605 current_cb_address = ipw_read_reg32(priv, IPW_DMA_I_CURRENT_CB);
1849 2606
1850 current_cb_index = (current_cb_address - CX2_SHARED_SRAM_DMA_CONTROL) / 2607 current_cb_index = (current_cb_address - IPW_SHARED_SRAM_DMA_CONTROL) /
1851 sizeof(struct command_block); 2608 sizeof(struct command_block);
1852 2609
1853 IPW_DEBUG_FW_INFO("Current CB index 0x%x address = 0x%X \n", 2610 IPW_DEBUG_FW_INFO("Current CB index 0x%x address = 0x%X \n",
@@ -1976,8 +2733,8 @@ static int ipw_fw_dma_wait(struct ipw_priv *priv)
1976 ipw_fw_dma_abort(priv); 2733 ipw_fw_dma_abort(priv);
1977 2734
1978 /*Disable the DMA in the CSR register */ 2735 /*Disable the DMA in the CSR register */
1979 ipw_set_bit(priv, CX2_RESET_REG, 2736 ipw_set_bit(priv, IPW_RESET_REG,
1980 CX2_RESET_REG_MASTER_DISABLED | CX2_RESET_REG_STOP_MASTER); 2737 IPW_RESET_REG_MASTER_DISABLED | IPW_RESET_REG_STOP_MASTER);
1981 2738
1982 IPW_DEBUG_FW("<< dmaWaitSync \n"); 2739 IPW_DEBUG_FW("<< dmaWaitSync \n");
1983 return 0; 2740 return 0;
@@ -1987,6 +2744,9 @@ static void ipw_remove_current_network(struct ipw_priv *priv)
1987{ 2744{
1988 struct list_head *element, *safe; 2745 struct list_head *element, *safe;
1989 struct ieee80211_network *network = NULL; 2746 struct ieee80211_network *network = NULL;
2747 unsigned long flags;
2748
2749 spin_lock_irqsave(&priv->ieee->lock, flags);
1990 list_for_each_safe(element, safe, &priv->ieee->network_list) { 2750 list_for_each_safe(element, safe, &priv->ieee->network_list) {
1991 network = list_entry(element, struct ieee80211_network, list); 2751 network = list_entry(element, struct ieee80211_network, list);
1992 if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) { 2752 if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
@@ -1995,6 +2755,7 @@ static void ipw_remove_current_network(struct ipw_priv *priv)
1995 &priv->ieee->network_free_list); 2755 &priv->ieee->network_free_list);
1996 } 2756 }
1997 } 2757 }
2758 spin_unlock_irqrestore(&priv->ieee->lock, flags);
1998} 2759}
1999 2760
2000/** 2761/**
@@ -2037,10 +2798,10 @@ static int ipw_stop_master(struct ipw_priv *priv)
2037 2798
2038 IPW_DEBUG_TRACE(">> \n"); 2799 IPW_DEBUG_TRACE(">> \n");
2039 /* stop master. typical delay - 0 */ 2800 /* stop master. typical delay - 0 */
2040 ipw_set_bit(priv, CX2_RESET_REG, CX2_RESET_REG_STOP_MASTER); 2801 ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER);
2041 2802
2042 rc = ipw_poll_bit(priv, CX2_RESET_REG, 2803 rc = ipw_poll_bit(priv, IPW_RESET_REG,
2043 CX2_RESET_REG_MASTER_DISABLED, 100); 2804 IPW_RESET_REG_MASTER_DISABLED, 100);
2044 if (rc < 0) { 2805 if (rc < 0) {
2045 IPW_ERROR("stop master failed in 10ms\n"); 2806 IPW_ERROR("stop master failed in 10ms\n");
2046 return -1; 2807 return -1;
@@ -2056,7 +2817,7 @@ static void ipw_arc_release(struct ipw_priv *priv)
2056 IPW_DEBUG_TRACE(">> \n"); 2817 IPW_DEBUG_TRACE(">> \n");
2057 mdelay(5); 2818 mdelay(5);
2058 2819
2059 ipw_clear_bit(priv, CX2_RESET_REG, CBD_RESET_REG_PRINCETON_RESET); 2820 ipw_clear_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET);
2060 2821
2061 /* no one knows timing, for safety add some delay */ 2822 /* no one knows timing, for safety add some delay */
2062 mdelay(5); 2823 mdelay(5);
@@ -2073,13 +2834,12 @@ struct fw_chunk {
2073}; 2834};
2074 2835
2075#define IPW_FW_MAJOR_VERSION 2 2836#define IPW_FW_MAJOR_VERSION 2
2076#define IPW_FW_MINOR_VERSION 2 2837#define IPW_FW_MINOR_VERSION 4
2077 2838
2078#define IPW_FW_MINOR(x) ((x & 0xff) >> 8) 2839#define IPW_FW_MINOR(x) ((x & 0xff) >> 8)
2079#define IPW_FW_MAJOR(x) (x & 0xff) 2840#define IPW_FW_MAJOR(x) (x & 0xff)
2080 2841
2081#define IPW_FW_VERSION ((IPW_FW_MINOR_VERSION << 8) | \ 2842#define IPW_FW_VERSION ((IPW_FW_MINOR_VERSION << 8) | IPW_FW_MAJOR_VERSION)
2082 IPW_FW_MAJOR_VERSION)
2083 2843
2084#define IPW_FW_PREFIX "ipw-" __stringify(IPW_FW_MAJOR_VERSION) \ 2844#define IPW_FW_PREFIX "ipw-" __stringify(IPW_FW_MAJOR_VERSION) \
2085"." __stringify(IPW_FW_MINOR_VERSION) "-" 2845"." __stringify(IPW_FW_MINOR_VERSION) "-"
@@ -2107,8 +2867,8 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2107 2867
2108// spin_lock_irqsave(&priv->lock, flags); 2868// spin_lock_irqsave(&priv->lock, flags);
2109 2869
2110 for (addr = CX2_SHARED_LOWER_BOUND; 2870 for (addr = IPW_SHARED_LOWER_BOUND;
2111 addr < CX2_REGISTER_DOMAIN1_END; addr += 4) { 2871 addr < IPW_REGISTER_DOMAIN1_END; addr += 4) {
2112 ipw_write32(priv, addr, 0); 2872 ipw_write32(priv, addr, 0);
2113 } 2873 }
2114 2874
@@ -2117,16 +2877,16 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2117 /* destroy DMA queues */ 2877 /* destroy DMA queues */
2118 /* reset sequence */ 2878 /* reset sequence */
2119 2879
2120 ipw_write_reg32(priv, CX2_MEM_HALT_AND_RESET, CX2_BIT_HALT_RESET_ON); 2880 ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_ON);
2121 ipw_arc_release(priv); 2881 ipw_arc_release(priv);
2122 ipw_write_reg32(priv, CX2_MEM_HALT_AND_RESET, CX2_BIT_HALT_RESET_OFF); 2882 ipw_write_reg32(priv, IPW_MEM_HALT_AND_RESET, IPW_BIT_HALT_RESET_OFF);
2123 mdelay(1); 2883 mdelay(1);
2124 2884
2125 /* reset PHY */ 2885 /* reset PHY */
2126 ipw_write_reg32(priv, CX2_INTERNAL_CMD_EVENT, CX2_BASEBAND_POWER_DOWN); 2886 ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, IPW_BASEBAND_POWER_DOWN);
2127 mdelay(1); 2887 mdelay(1);
2128 2888
2129 ipw_write_reg32(priv, CX2_INTERNAL_CMD_EVENT, 0); 2889 ipw_write_reg32(priv, IPW_INTERNAL_CMD_EVENT, 0);
2130 mdelay(1); 2890 mdelay(1);
2131 2891
2132 /* enable ucode store */ 2892 /* enable ucode store */
@@ -2144,18 +2904,19 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2144 */ 2904 */
2145 /* load new ipw uCode */ 2905 /* load new ipw uCode */
2146 for (i = 0; i < len / 2; i++) 2906 for (i = 0; i < len / 2; i++)
2147 ipw_write_reg16(priv, CX2_BASEBAND_CONTROL_STORE, image[i]); 2907 ipw_write_reg16(priv, IPW_BASEBAND_CONTROL_STORE,
2908 cpu_to_le16(image[i]));
2148 2909
2149 /* enable DINO */ 2910 /* enable DINO */
2150 ipw_write_reg8(priv, CX2_BASEBAND_CONTROL_STATUS, 0); 2911 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0);
2151 ipw_write_reg8(priv, CX2_BASEBAND_CONTROL_STATUS, DINO_ENABLE_SYSTEM); 2912 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_SYSTEM);
2152 2913
2153 /* this is where the igx / win driver deveates from the VAP driver. */ 2914 /* this is where the igx / win driver deveates from the VAP driver. */
2154 2915
2155 /* wait for alive response */ 2916 /* wait for alive response */
2156 for (i = 0; i < 100; i++) { 2917 for (i = 0; i < 100; i++) {
2157 /* poll for incoming data */ 2918 /* poll for incoming data */
2158 cr = ipw_read_reg8(priv, CX2_BASEBAND_CONTROL_STATUS); 2919 cr = ipw_read_reg8(priv, IPW_BASEBAND_CONTROL_STATUS);
2159 if (cr & DINO_RXFIFO_DATA) 2920 if (cr & DINO_RXFIFO_DATA)
2160 break; 2921 break;
2161 mdelay(1); 2922 mdelay(1);
@@ -2167,7 +2928,8 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2167 2928
2168 for (i = 0; i < ARRAY_SIZE(response_buffer); i++) 2929 for (i = 0; i < ARRAY_SIZE(response_buffer); i++)
2169 response_buffer[i] = 2930 response_buffer[i] =
2170 ipw_read_reg32(priv, CX2_BASEBAND_RX_FIFO_READ); 2931 le32_to_cpu(ipw_read_reg32(priv,
2932 IPW_BASEBAND_RX_FIFO_READ));
2171 memcpy(&priv->dino_alive, response_buffer, 2933 memcpy(&priv->dino_alive, response_buffer,
2172 sizeof(priv->dino_alive)); 2934 sizeof(priv->dino_alive));
2173 if (priv->dino_alive.alive_command == 1 2935 if (priv->dino_alive.alive_command == 1
@@ -2196,7 +2958,7 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len)
2196 2958
2197 /* disable DINO, otherwise for some reason 2959 /* disable DINO, otherwise for some reason
2198 firmware have problem getting alive resp. */ 2960 firmware have problem getting alive resp. */
2199 ipw_write_reg8(priv, CX2_BASEBAND_CONTROL_STATUS, 0); 2961 ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0);
2200 2962
2201// spin_unlock_irqrestore(&priv->lock, flags); 2963// spin_unlock_irqrestore(&priv->lock, flags);
2202 2964
@@ -2236,13 +2998,14 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)
2236 * offeset*/ 2998 * offeset*/
2237 /* Dma loading */ 2999 /* Dma loading */
2238 rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset, 3000 rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset,
2239 chunk->address, chunk->length); 3001 le32_to_cpu(chunk->address),
3002 le32_to_cpu(chunk->length));
2240 if (rc) { 3003 if (rc) {
2241 IPW_DEBUG_INFO("dmaAddBuffer Failed\n"); 3004 IPW_DEBUG_INFO("dmaAddBuffer Failed\n");
2242 goto out; 3005 goto out;
2243 } 3006 }
2244 3007
2245 offset += chunk->length; 3008 offset += le32_to_cpu(chunk->length);
2246 } while (offset < len); 3009 } while (offset < len);
2247 3010
2248 /* Run the DMA and wait for the answer */ 3011 /* Run the DMA and wait for the answer */
@@ -2268,16 +3031,16 @@ static int ipw_stop_nic(struct ipw_priv *priv)
2268 int rc = 0; 3031 int rc = 0;
2269 3032
2270 /* stop */ 3033 /* stop */
2271 ipw_write32(priv, CX2_RESET_REG, CX2_RESET_REG_STOP_MASTER); 3034 ipw_write32(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER);
2272 3035
2273 rc = ipw_poll_bit(priv, CX2_RESET_REG, 3036 rc = ipw_poll_bit(priv, IPW_RESET_REG,
2274 CX2_RESET_REG_MASTER_DISABLED, 500); 3037 IPW_RESET_REG_MASTER_DISABLED, 500);
2275 if (rc < 0) { 3038 if (rc < 0) {
2276 IPW_ERROR("wait for reg master disabled failed\n"); 3039 IPW_ERROR("wait for reg master disabled failed\n");
2277 return rc; 3040 return rc;
2278 } 3041 }
2279 3042
2280 ipw_set_bit(priv, CX2_RESET_REG, CBD_RESET_REG_PRINCETON_RESET); 3043 ipw_set_bit(priv, IPW_RESET_REG, CBD_RESET_REG_PRINCETON_RESET);
2281 3044
2282 return rc; 3045 return rc;
2283} 3046}
@@ -2287,14 +3050,14 @@ static void ipw_start_nic(struct ipw_priv *priv)
2287 IPW_DEBUG_TRACE(">>\n"); 3050 IPW_DEBUG_TRACE(">>\n");
2288 3051
2289 /* prvHwStartNic release ARC */ 3052 /* prvHwStartNic release ARC */
2290 ipw_clear_bit(priv, CX2_RESET_REG, 3053 ipw_clear_bit(priv, IPW_RESET_REG,
2291 CX2_RESET_REG_MASTER_DISABLED | 3054 IPW_RESET_REG_MASTER_DISABLED |
2292 CX2_RESET_REG_STOP_MASTER | 3055 IPW_RESET_REG_STOP_MASTER |
2293 CBD_RESET_REG_PRINCETON_RESET); 3056 CBD_RESET_REG_PRINCETON_RESET);
2294 3057
2295 /* enable power management */ 3058 /* enable power management */
2296 ipw_set_bit(priv, CX2_GP_CNTRL_RW, 3059 ipw_set_bit(priv, IPW_GP_CNTRL_RW,
2297 CX2_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY); 3060 IPW_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
2298 3061
2299 IPW_DEBUG_TRACE("<<\n"); 3062 IPW_DEBUG_TRACE("<<\n");
2300} 3063}
@@ -2307,25 +3070,25 @@ static int ipw_init_nic(struct ipw_priv *priv)
2307 /* reset */ 3070 /* reset */
2308 /*prvHwInitNic */ 3071 /*prvHwInitNic */
2309 /* set "initialization complete" bit to move adapter to D0 state */ 3072 /* set "initialization complete" bit to move adapter to D0 state */
2310 ipw_set_bit(priv, CX2_GP_CNTRL_RW, CX2_GP_CNTRL_BIT_INIT_DONE); 3073 ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE);
2311 3074
2312 /* low-level PLL activation */ 3075 /* low-level PLL activation */
2313 ipw_write32(priv, CX2_READ_INT_REGISTER, 3076 ipw_write32(priv, IPW_READ_INT_REGISTER,
2314 CX2_BIT_INT_HOST_SRAM_READ_INT_REGISTER); 3077 IPW_BIT_INT_HOST_SRAM_READ_INT_REGISTER);
2315 3078
2316 /* wait for clock stabilization */ 3079 /* wait for clock stabilization */
2317 rc = ipw_poll_bit(priv, CX2_GP_CNTRL_RW, 3080 rc = ipw_poll_bit(priv, IPW_GP_CNTRL_RW,
2318 CX2_GP_CNTRL_BIT_CLOCK_READY, 250); 3081 IPW_GP_CNTRL_BIT_CLOCK_READY, 250);
2319 if (rc < 0) 3082 if (rc < 0)
2320 IPW_DEBUG_INFO("FAILED wait for clock stablization\n"); 3083 IPW_DEBUG_INFO("FAILED wait for clock stablization\n");
2321 3084
2322 /* assert SW reset */ 3085 /* assert SW reset */
2323 ipw_set_bit(priv, CX2_RESET_REG, CX2_RESET_REG_SW_RESET); 3086 ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_SW_RESET);
2324 3087
2325 udelay(10); 3088 udelay(10);
2326 3089
2327 /* set "initialization complete" bit to move adapter to D0 state */ 3090 /* set "initialization complete" bit to move adapter to D0 state */
2328 ipw_set_bit(priv, CX2_GP_CNTRL_RW, CX2_GP_CNTRL_BIT_INIT_DONE); 3091 ipw_set_bit(priv, IPW_GP_CNTRL_RW, IPW_GP_CNTRL_BIT_INIT_DONE);
2329 3092
2330 IPW_DEBUG_TRACE(">>\n"); 3093 IPW_DEBUG_TRACE(">>\n");
2331 return 0; 3094 return 0;
@@ -2337,14 +3100,19 @@ static int ipw_init_nic(struct ipw_priv *priv)
2337static int ipw_reset_nic(struct ipw_priv *priv) 3100static int ipw_reset_nic(struct ipw_priv *priv)
2338{ 3101{
2339 int rc = 0; 3102 int rc = 0;
3103 unsigned long flags;
2340 3104
2341 IPW_DEBUG_TRACE(">>\n"); 3105 IPW_DEBUG_TRACE(">>\n");
2342 3106
2343 rc = ipw_init_nic(priv); 3107 rc = ipw_init_nic(priv);
2344 3108
3109 spin_lock_irqsave(&priv->lock, flags);
2345 /* Clear the 'host command active' bit... */ 3110 /* Clear the 'host command active' bit... */
2346 priv->status &= ~STATUS_HCMD_ACTIVE; 3111 priv->status &= ~STATUS_HCMD_ACTIVE;
2347 wake_up_interruptible(&priv->wait_command_queue); 3112 wake_up_interruptible(&priv->wait_command_queue);
3113 priv->status &= ~(STATUS_SCANNING | STATUS_SCAN_ABORTING);
3114 wake_up_interruptible(&priv->wait_state);
3115 spin_unlock_irqrestore(&priv->lock, flags);
2348 3116
2349 IPW_DEBUG_TRACE("<<\n"); 3117 IPW_DEBUG_TRACE("<<\n");
2350 return rc; 3118 return rc;
@@ -2364,22 +3132,23 @@ static int ipw_get_fw(struct ipw_priv *priv,
2364 } 3132 }
2365 3133
2366 header = (struct fw_header *)(*fw)->data; 3134 header = (struct fw_header *)(*fw)->data;
2367 if (IPW_FW_MAJOR(header->version) != IPW_FW_MAJOR_VERSION) { 3135 if (IPW_FW_MAJOR(le32_to_cpu(header->version)) != IPW_FW_MAJOR_VERSION) {
2368 IPW_ERROR("'%s' firmware version not compatible (%d != %d)\n", 3136 IPW_ERROR("'%s' firmware version not compatible (%d != %d)\n",
2369 name, 3137 name,
2370 IPW_FW_MAJOR(header->version), IPW_FW_MAJOR_VERSION); 3138 IPW_FW_MAJOR(le32_to_cpu(header->version)),
3139 IPW_FW_MAJOR_VERSION);
2371 return -EINVAL; 3140 return -EINVAL;
2372 } 3141 }
2373 3142
2374 IPW_DEBUG_INFO("Loading firmware '%s' file v%d.%d (%zd bytes)\n", 3143 IPW_DEBUG_INFO("Loading firmware '%s' file v%d.%d (%zd bytes)\n",
2375 name, 3144 name,
2376 IPW_FW_MAJOR(header->version), 3145 IPW_FW_MAJOR(le32_to_cpu(header->version)),
2377 IPW_FW_MINOR(header->version), 3146 IPW_FW_MINOR(le32_to_cpu(header->version)),
2378 (*fw)->size - sizeof(struct fw_header)); 3147 (*fw)->size - sizeof(struct fw_header));
2379 return 0; 3148 return 0;
2380} 3149}
2381 3150
2382#define CX2_RX_BUF_SIZE (3000) 3151#define IPW_RX_BUF_SIZE (3000)
2383 3152
2384static inline void ipw_rx_queue_reset(struct ipw_priv *priv, 3153static inline void ipw_rx_queue_reset(struct ipw_priv *priv,
2385 struct ipw_rx_queue *rxq) 3154 struct ipw_rx_queue *rxq)
@@ -2398,8 +3167,9 @@ static inline void ipw_rx_queue_reset(struct ipw_priv *priv,
2398 * to an SKB, so we need to unmap and free potential storage */ 3167 * to an SKB, so we need to unmap and free potential storage */
2399 if (rxq->pool[i].skb != NULL) { 3168 if (rxq->pool[i].skb != NULL) {
2400 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr, 3169 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr,
2401 CX2_RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 3170 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
2402 dev_kfree_skb(rxq->pool[i].skb); 3171 dev_kfree_skb(rxq->pool[i].skb);
3172 rxq->pool[i].skb = NULL;
2403 } 3173 }
2404 list_add_tail(&rxq->pool[i].list, &rxq->rx_used); 3174 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
2405 } 3175 }
@@ -2417,6 +3187,19 @@ static int fw_loaded = 0;
2417static const struct firmware *bootfw = NULL; 3187static const struct firmware *bootfw = NULL;
2418static const struct firmware *firmware = NULL; 3188static const struct firmware *firmware = NULL;
2419static const struct firmware *ucode = NULL; 3189static const struct firmware *ucode = NULL;
3190
3191static void free_firmware(void)
3192{
3193 if (fw_loaded) {
3194 release_firmware(bootfw);
3195 release_firmware(ucode);
3196 release_firmware(firmware);
3197 bootfw = ucode = firmware = NULL;
3198 fw_loaded = 0;
3199 }
3200}
3201#else
3202#define free_firmware() do {} while (0)
2420#endif 3203#endif
2421 3204
2422static int ipw_load(struct ipw_priv *priv) 3205static int ipw_load(struct ipw_priv *priv)
@@ -2445,10 +3228,10 @@ static int ipw_load(struct ipw_priv *priv)
2445 rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("ibss")); 3228 rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("ibss"));
2446 break; 3229 break;
2447 3230
2448#ifdef CONFIG_IPW_PROMISC 3231#ifdef CONFIG_IPW2200_MONITOR
2449 case IW_MODE_MONITOR: 3232 case IW_MODE_MONITOR:
2450 rc = ipw_get_fw(priv, &ucode, 3233 rc = ipw_get_fw(priv, &ucode,
2451 IPW_FW_NAME("ibss_ucode")); 3234 IPW_FW_NAME("sniffer_ucode"));
2452 if (rc) 3235 if (rc)
2453 goto error; 3236 goto error;
2454 3237
@@ -2487,11 +3270,11 @@ static int ipw_load(struct ipw_priv *priv)
2487 3270
2488 retry: 3271 retry:
2489 /* Ensure interrupts are disabled */ 3272 /* Ensure interrupts are disabled */
2490 ipw_write32(priv, CX2_INTA_MASK_R, ~CX2_INTA_MASK_ALL); 3273 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
2491 priv->status &= ~STATUS_INT_ENABLED; 3274 priv->status &= ~STATUS_INT_ENABLED;
2492 3275
2493 /* ack pending interrupts */ 3276 /* ack pending interrupts */
2494 ipw_write32(priv, CX2_INTA_RW, CX2_INTA_MASK_ALL); 3277 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
2495 3278
2496 ipw_stop_nic(priv); 3279 ipw_stop_nic(priv);
2497 3280
@@ -2501,14 +3284,14 @@ static int ipw_load(struct ipw_priv *priv)
2501 goto error; 3284 goto error;
2502 } 3285 }
2503 3286
2504 ipw_zero_memory(priv, CX2_NIC_SRAM_LOWER_BOUND, 3287 ipw_zero_memory(priv, IPW_NIC_SRAM_LOWER_BOUND,
2505 CX2_NIC_SRAM_UPPER_BOUND - CX2_NIC_SRAM_LOWER_BOUND); 3288 IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND);
2506 3289
2507 /* DMA the initial boot firmware into the device */ 3290 /* DMA the initial boot firmware into the device */
2508 rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header), 3291 rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header),
2509 bootfw->size - sizeof(struct fw_header)); 3292 bootfw->size - sizeof(struct fw_header));
2510 if (rc < 0) { 3293 if (rc < 0) {
2511 IPW_ERROR("Unable to load boot firmware\n"); 3294 IPW_ERROR("Unable to load boot firmware: %d\n", rc);
2512 goto error; 3295 goto error;
2513 } 3296 }
2514 3297
@@ -2516,8 +3299,8 @@ static int ipw_load(struct ipw_priv *priv)
2516 ipw_start_nic(priv); 3299 ipw_start_nic(priv);
2517 3300
2518 /* wait for the device to finish it's initial startup sequence */ 3301 /* wait for the device to finish it's initial startup sequence */
2519 rc = ipw_poll_bit(priv, CX2_INTA_RW, 3302 rc = ipw_poll_bit(priv, IPW_INTA_RW,
2520 CX2_INTA_BIT_FW_INITIALIZATION_DONE, 500); 3303 IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500);
2521 if (rc < 0) { 3304 if (rc < 0) {
2522 IPW_ERROR("device failed to boot initial fw image\n"); 3305 IPW_ERROR("device failed to boot initial fw image\n");
2523 goto error; 3306 goto error;
@@ -2525,13 +3308,13 @@ static int ipw_load(struct ipw_priv *priv)
2525 IPW_DEBUG_INFO("initial device response after %dms\n", rc); 3308 IPW_DEBUG_INFO("initial device response after %dms\n", rc);
2526 3309
2527 /* ack fw init done interrupt */ 3310 /* ack fw init done interrupt */
2528 ipw_write32(priv, CX2_INTA_RW, CX2_INTA_BIT_FW_INITIALIZATION_DONE); 3311 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE);
2529 3312
2530 /* DMA the ucode into the device */ 3313 /* DMA the ucode into the device */
2531 rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header), 3314 rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header),
2532 ucode->size - sizeof(struct fw_header)); 3315 ucode->size - sizeof(struct fw_header));
2533 if (rc < 0) { 3316 if (rc < 0) {
2534 IPW_ERROR("Unable to load ucode\n"); 3317 IPW_ERROR("Unable to load ucode: %d\n", rc);
2535 goto error; 3318 goto error;
2536 } 3319 }
2537 3320
@@ -2543,7 +3326,7 @@ static int ipw_load(struct ipw_priv *priv)
2543 sizeof(struct fw_header), 3326 sizeof(struct fw_header),
2544 firmware->size - sizeof(struct fw_header)); 3327 firmware->size - sizeof(struct fw_header));
2545 if (rc < 0) { 3328 if (rc < 0) {
2546 IPW_ERROR("Unable to load firmware\n"); 3329 IPW_ERROR("Unable to load firmware: %d\n", rc);
2547 goto error; 3330 goto error;
2548 } 3331 }
2549 3332
@@ -2556,12 +3339,14 @@ static int ipw_load(struct ipw_priv *priv)
2556 } 3339 }
2557 3340
2558 /* Ensure interrupts are disabled */ 3341 /* Ensure interrupts are disabled */
2559 ipw_write32(priv, CX2_INTA_MASK_R, ~CX2_INTA_MASK_ALL); 3342 ipw_write32(priv, IPW_INTA_MASK_R, ~IPW_INTA_MASK_ALL);
3343 /* ack pending interrupts */
3344 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
2560 3345
2561 /* kick start the device */ 3346 /* kick start the device */
2562 ipw_start_nic(priv); 3347 ipw_start_nic(priv);
2563 3348
2564 if (ipw_read32(priv, CX2_INTA_RW) & CX2_INTA_BIT_PARITY_ERROR) { 3349 if (ipw_read32(priv, IPW_INTA_RW) & IPW_INTA_BIT_PARITY_ERROR) {
2565 if (retries > 0) { 3350 if (retries > 0) {
2566 IPW_WARNING("Parity error. Retrying init.\n"); 3351 IPW_WARNING("Parity error. Retrying init.\n");
2567 retries--; 3352 retries--;
@@ -2574,8 +3359,8 @@ static int ipw_load(struct ipw_priv *priv)
2574 } 3359 }
2575 3360
2576 /* wait for the device */ 3361 /* wait for the device */
2577 rc = ipw_poll_bit(priv, CX2_INTA_RW, 3362 rc = ipw_poll_bit(priv, IPW_INTA_RW,
2578 CX2_INTA_BIT_FW_INITIALIZATION_DONE, 500); 3363 IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500);
2579 if (rc < 0) { 3364 if (rc < 0) {
2580 IPW_ERROR("device failed to start after 500ms\n"); 3365 IPW_ERROR("device failed to start after 500ms\n");
2581 goto error; 3366 goto error;
@@ -2583,7 +3368,7 @@ static int ipw_load(struct ipw_priv *priv)
2583 IPW_DEBUG_INFO("device response after %dms\n", rc); 3368 IPW_DEBUG_INFO("device response after %dms\n", rc);
2584 3369
2585 /* ack fw init done interrupt */ 3370 /* ack fw init done interrupt */
2586 ipw_write32(priv, CX2_INTA_RW, CX2_INTA_BIT_FW_INITIALIZATION_DONE); 3371 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE);
2587 3372
2588 /* read eeprom data and initialize the eeprom region of sram */ 3373 /* read eeprom data and initialize the eeprom region of sram */
2589 priv->eeprom_delay = 1; 3374 priv->eeprom_delay = 1;
@@ -2595,10 +3380,10 @@ static int ipw_load(struct ipw_priv *priv)
2595 /* Ensure our queue has valid packets */ 3380 /* Ensure our queue has valid packets */
2596 ipw_rx_queue_replenish(priv); 3381 ipw_rx_queue_replenish(priv);
2597 3382
2598 ipw_write32(priv, CX2_RX_READ_INDEX, priv->rxq->read); 3383 ipw_write32(priv, IPW_RX_READ_INDEX, priv->rxq->read);
2599 3384
2600 /* ack pending interrupts */ 3385 /* ack pending interrupts */
2601 ipw_write32(priv, CX2_INTA_RW, CX2_INTA_MASK_ALL); 3386 ipw_write32(priv, IPW_INTA_RW, IPW_INTA_MASK_ALL);
2602 3387
2603#ifndef CONFIG_PM 3388#ifndef CONFIG_PM
2604 release_firmware(bootfw); 3389 release_firmware(bootfw);
@@ -2755,16 +3540,18 @@ static void ipw_queue_tx_free_tfd(struct ipw_priv *priv,
2755 return; 3540 return;
2756 3541
2757 /* sanity check */ 3542 /* sanity check */
2758 if (bd->u.data.num_chunks > NUM_TFD_CHUNKS) { 3543 if (le32_to_cpu(bd->u.data.num_chunks) > NUM_TFD_CHUNKS) {
2759 IPW_ERROR("Too many chunks: %i\n", bd->u.data.num_chunks); 3544 IPW_ERROR("Too many chunks: %i\n",
3545 le32_to_cpu(bd->u.data.num_chunks));
2760 /** @todo issue fatal error, it is quite serious situation */ 3546 /** @todo issue fatal error, it is quite serious situation */
2761 return; 3547 return;
2762 } 3548 }
2763 3549
2764 /* unmap chunks if any */ 3550 /* unmap chunks if any */
2765 for (i = 0; i < bd->u.data.num_chunks; i++) { 3551 for (i = 0; i < le32_to_cpu(bd->u.data.num_chunks); i++) {
2766 pci_unmap_single(dev, bd->u.data.chunk_ptr[i], 3552 pci_unmap_single(dev, le32_to_cpu(bd->u.data.chunk_ptr[i]),
2767 bd->u.data.chunk_len[i], PCI_DMA_TODEVICE); 3553 le16_to_cpu(bd->u.data.chunk_len[i]),
3554 PCI_DMA_TODEVICE);
2768 if (txq->txb[txq->q.last_used]) { 3555 if (txq->txb[txq->q.last_used]) {
2769 ieee80211_txb_free(txq->txb[txq->q.last_used]); 3556 ieee80211_txb_free(txq->txb[txq->q.last_used]);
2770 txq->txb[txq->q.last_used] = NULL; 3557 txq->txb[txq->q.last_used] = NULL;
@@ -2821,21 +3608,6 @@ static void ipw_tx_queue_free(struct ipw_priv *priv)
2821 ipw_queue_tx_free(priv, &priv->txq[3]); 3608 ipw_queue_tx_free(priv, &priv->txq[3]);
2822} 3609}
2823 3610
2824static void inline __maybe_wake_tx(struct ipw_priv *priv)
2825{
2826 if (netif_running(priv->net_dev)) {
2827 switch (priv->port_type) {
2828 case DCR_TYPE_MU_BSS:
2829 case DCR_TYPE_MU_IBSS:
2830 if (!(priv->status & STATUS_ASSOCIATED)) {
2831 return;
2832 }
2833 }
2834 netif_wake_queue(priv->net_dev);
2835 }
2836
2837}
2838
2839static inline void ipw_create_bssid(struct ipw_priv *priv, u8 * bssid) 3611static inline void ipw_create_bssid(struct ipw_priv *priv, u8 * bssid)
2840{ 3612{
2841 /* First 3 bytes are manufacturer */ 3613 /* First 3 bytes are manufacturer */
@@ -2898,7 +3670,13 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
2898{ 3670{
2899 int err; 3671 int err;
2900 3672
2901 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED))) { 3673 if (priv->status & STATUS_ASSOCIATING) {
3674 IPW_DEBUG_ASSOC("Disassociating while associating.\n");
3675 queue_work(priv->workqueue, &priv->disassociate);
3676 return;
3677 }
3678
3679 if (!(priv->status & STATUS_ASSOCIATED)) {
2902 IPW_DEBUG_ASSOC("Disassociating while not associated.\n"); 3680 IPW_DEBUG_ASSOC("Disassociating while not associated.\n");
2903 return; 3681 return;
2904 } 3682 }
@@ -2915,6 +3693,7 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
2915 priv->assoc_request.assoc_type = HC_DISASSOC_QUIET; 3693 priv->assoc_request.assoc_type = HC_DISASSOC_QUIET;
2916 else 3694 else
2917 priv->assoc_request.assoc_type = HC_DISASSOCIATE; 3695 priv->assoc_request.assoc_type = HC_DISASSOCIATE;
3696
2918 err = ipw_send_associate(priv, &priv->assoc_request); 3697 err = ipw_send_associate(priv, &priv->assoc_request);
2919 if (err) { 3698 if (err) {
2920 IPW_DEBUG_HC("Attempt to send [dis]associate command " 3699 IPW_DEBUG_HC("Attempt to send [dis]associate command "
@@ -2924,20 +3703,27 @@ static void ipw_send_disassociate(struct ipw_priv *priv, int quiet)
2924 3703
2925} 3704}
2926 3705
2927static void ipw_disassociate(void *data) 3706static int ipw_disassociate(void *data)
2928{ 3707{
3708 struct ipw_priv *priv = data;
3709 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
3710 return 0;
2929 ipw_send_disassociate(data, 0); 3711 ipw_send_disassociate(data, 0);
3712 return 1;
2930} 3713}
2931 3714
2932static void notify_wx_assoc_event(struct ipw_priv *priv) 3715static void ipw_bg_disassociate(void *data)
2933{ 3716{
2934 union iwreq_data wrqu; 3717 struct ipw_priv *priv = data;
2935 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 3718 down(&priv->sem);
2936 if (priv->status & STATUS_ASSOCIATED) 3719 ipw_disassociate(data);
2937 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); 3720 up(&priv->sem);
2938 else 3721}
2939 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 3722
2940 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); 3723static void ipw_system_config(void *data)
3724{
3725 struct ipw_priv *priv = data;
3726 ipw_send_system_config(priv, &priv->sys_config);
2941} 3727}
2942 3728
2943struct ipw_status_code { 3729struct ipw_status_code {
@@ -2997,7 +3783,7 @@ static const char *ipw_get_status_code(u16 status)
2997{ 3783{
2998 int i; 3784 int i;
2999 for (i = 0; i < ARRAY_SIZE(ipw_status_codes); i++) 3785 for (i = 0; i < ARRAY_SIZE(ipw_status_codes); i++)
3000 if (ipw_status_codes[i].status == status) 3786 if (ipw_status_codes[i].status == (status & 0xff))
3001 return ipw_status_codes[i].reason; 3787 return ipw_status_codes[i].reason;
3002 return "Unknown status value."; 3788 return "Unknown status value.";
3003} 3789}
@@ -3076,18 +3862,30 @@ static inline u32 ipw_get_max_rate(struct ipw_priv *priv)
3076 while (i && !(mask & i)) 3862 while (i && !(mask & i))
3077 i >>= 1; 3863 i >>= 1;
3078 switch (i) { 3864 switch (i) {
3079 case IEEE80211_CCK_RATE_1MB_MASK: return 1000000; 3865 case IEEE80211_CCK_RATE_1MB_MASK:
3080 case IEEE80211_CCK_RATE_2MB_MASK: return 2000000; 3866 return 1000000;
3081 case IEEE80211_CCK_RATE_5MB_MASK: return 5500000; 3867 case IEEE80211_CCK_RATE_2MB_MASK:
3082 case IEEE80211_OFDM_RATE_6MB_MASK: return 6000000; 3868 return 2000000;
3083 case IEEE80211_OFDM_RATE_9MB_MASK: return 9000000; 3869 case IEEE80211_CCK_RATE_5MB_MASK:
3084 case IEEE80211_CCK_RATE_11MB_MASK: return 11000000; 3870 return 5500000;
3085 case IEEE80211_OFDM_RATE_12MB_MASK: return 12000000; 3871 case IEEE80211_OFDM_RATE_6MB_MASK:
3086 case IEEE80211_OFDM_RATE_18MB_MASK: return 18000000; 3872 return 6000000;
3087 case IEEE80211_OFDM_RATE_24MB_MASK: return 24000000; 3873 case IEEE80211_OFDM_RATE_9MB_MASK:
3088 case IEEE80211_OFDM_RATE_36MB_MASK: return 36000000; 3874 return 9000000;
3089 case IEEE80211_OFDM_RATE_48MB_MASK: return 48000000; 3875 case IEEE80211_CCK_RATE_11MB_MASK:
3090 case IEEE80211_OFDM_RATE_54MB_MASK: return 54000000; 3876 return 11000000;
3877 case IEEE80211_OFDM_RATE_12MB_MASK:
3878 return 12000000;
3879 case IEEE80211_OFDM_RATE_18MB_MASK:
3880 return 18000000;
3881 case IEEE80211_OFDM_RATE_24MB_MASK:
3882 return 24000000;
3883 case IEEE80211_OFDM_RATE_36MB_MASK:
3884 return 36000000;
3885 case IEEE80211_OFDM_RATE_48MB_MASK:
3886 return 48000000;
3887 case IEEE80211_OFDM_RATE_54MB_MASK:
3888 return 54000000;
3091 } 3889 }
3092 3890
3093 if (priv->ieee->mode == IEEE_B) 3891 if (priv->ieee->mode == IEEE_B)
@@ -3115,25 +3913,35 @@ static u32 ipw_get_current_rate(struct ipw_priv *priv)
3115 return ipw_get_max_rate(priv); 3913 return ipw_get_max_rate(priv);
3116 3914
3117 switch (rate) { 3915 switch (rate) {
3118 case IPW_TX_RATE_1MB: return 1000000; 3916 case IPW_TX_RATE_1MB:
3119 case IPW_TX_RATE_2MB: return 2000000; 3917 return 1000000;
3120 case IPW_TX_RATE_5MB: return 5500000; 3918 case IPW_TX_RATE_2MB:
3121 case IPW_TX_RATE_6MB: return 6000000; 3919 return 2000000;
3122 case IPW_TX_RATE_9MB: return 9000000; 3920 case IPW_TX_RATE_5MB:
3123 case IPW_TX_RATE_11MB: return 11000000; 3921 return 5500000;
3124 case IPW_TX_RATE_12MB: return 12000000; 3922 case IPW_TX_RATE_6MB:
3125 case IPW_TX_RATE_18MB: return 18000000; 3923 return 6000000;
3126 case IPW_TX_RATE_24MB: return 24000000; 3924 case IPW_TX_RATE_9MB:
3127 case IPW_TX_RATE_36MB: return 36000000; 3925 return 9000000;
3128 case IPW_TX_RATE_48MB: return 48000000; 3926 case IPW_TX_RATE_11MB:
3129 case IPW_TX_RATE_54MB: return 54000000; 3927 return 11000000;
3928 case IPW_TX_RATE_12MB:
3929 return 12000000;
3930 case IPW_TX_RATE_18MB:
3931 return 18000000;
3932 case IPW_TX_RATE_24MB:
3933 return 24000000;
3934 case IPW_TX_RATE_36MB:
3935 return 36000000;
3936 case IPW_TX_RATE_48MB:
3937 return 48000000;
3938 case IPW_TX_RATE_54MB:
3939 return 54000000;
3130 } 3940 }
3131 3941
3132 return 0; 3942 return 0;
3133} 3943}
3134 3944
3135#define PERFECT_RSSI (-50)
3136#define WORST_RSSI (-85)
3137#define IPW_STATS_INTERVAL (2 * HZ) 3945#define IPW_STATS_INTERVAL (2 * HZ)
3138static void ipw_gather_stats(struct ipw_priv *priv) 3946static void ipw_gather_stats(struct ipw_priv *priv)
3139{ 3947{
@@ -3145,6 +3953,7 @@ static void ipw_gather_stats(struct ipw_priv *priv)
3145 s16 rssi; 3953 s16 rssi;
3146 u32 beacon_quality, signal_quality, tx_quality, rx_quality, 3954 u32 beacon_quality, signal_quality, tx_quality, rx_quality,
3147 rate_quality; 3955 rate_quality;
3956 u32 max_rate;
3148 3957
3149 if (!(priv->status & STATUS_ASSOCIATED)) { 3958 if (!(priv->status & STATUS_ASSOCIATED)) {
3150 priv->quality = 0; 3959 priv->quality = 0;
@@ -3201,7 +4010,8 @@ static void ipw_gather_stats(struct ipw_priv *priv)
3201 beacon_quality, missed_beacons_percent); 4010 beacon_quality, missed_beacons_percent);
3202 4011
3203 priv->last_rate = ipw_get_current_rate(priv); 4012 priv->last_rate = ipw_get_current_rate(priv);
3204 rate_quality = priv->last_rate * 40 / priv->last_rate + 60; 4013 max_rate = ipw_get_max_rate(priv);
4014 rate_quality = priv->last_rate * 40 / max_rate + 60;
3205 IPW_DEBUG_STATS("Rate quality : %3d%% (%dMbs)\n", 4015 IPW_DEBUG_STATS("Rate quality : %3d%% (%dMbs)\n",
3206 rate_quality, priv->last_rate / 1000000); 4016 rate_quality, priv->last_rate / 1000000);
3207 4017
@@ -3222,13 +4032,20 @@ static void ipw_gather_stats(struct ipw_priv *priv)
3222 tx_quality, tx_failures_delta, tx_packets_delta); 4032 tx_quality, tx_failures_delta, tx_packets_delta);
3223 4033
3224 rssi = average_value(&priv->average_rssi); 4034 rssi = average_value(&priv->average_rssi);
3225 if (rssi > PERFECT_RSSI) 4035 signal_quality =
4036 (100 *
4037 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) *
4038 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) -
4039 (priv->ieee->perfect_rssi - rssi) *
4040 (15 * (priv->ieee->perfect_rssi - priv->ieee->worst_rssi) +
4041 62 * (priv->ieee->perfect_rssi - rssi))) /
4042 ((priv->ieee->perfect_rssi - priv->ieee->worst_rssi) *
4043 (priv->ieee->perfect_rssi - priv->ieee->worst_rssi));
4044 if (signal_quality > 100)
3226 signal_quality = 100; 4045 signal_quality = 100;
3227 else if (rssi < WORST_RSSI) 4046 else if (signal_quality < 1)
3228 signal_quality = 0; 4047 signal_quality = 0;
3229 else 4048
3230 signal_quality = (rssi - WORST_RSSI) * 100 /
3231 (PERFECT_RSSI - WORST_RSSI);
3232 IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n", 4049 IPW_DEBUG_STATS("Signal level : %3d%% (%d dBm)\n",
3233 signal_quality, rssi); 4050 signal_quality, rssi);
3234 4051
@@ -3257,6 +4074,85 @@ static void ipw_gather_stats(struct ipw_priv *priv)
3257 IPW_STATS_INTERVAL); 4074 IPW_STATS_INTERVAL);
3258} 4075}
3259 4076
4077static void ipw_bg_gather_stats(void *data)
4078{
4079 struct ipw_priv *priv = data;
4080 down(&priv->sem);
4081 ipw_gather_stats(data);
4082 up(&priv->sem);
4083}
4084
4085/* Missed beacon behavior:
4086 * 1st missed -> roaming_threshold, just wait, don't do any scan/roam.
4087 * roaming_threshold -> disassociate_threshold, scan and roam for better signal.
4088 * Above disassociate threshold, give up and stop scanning.
4089 * Roaming is disabled if disassociate_threshold <= roaming_threshold */
4090static inline void ipw_handle_missed_beacon(struct ipw_priv *priv,
4091 int missed_count)
4092{
4093 priv->notif_missed_beacons = missed_count;
4094
4095 if (missed_count > priv->disassociate_threshold &&
4096 priv->status & STATUS_ASSOCIATED) {
4097 /* If associated and we've hit the missed
4098 * beacon threshold, disassociate, turn
4099 * off roaming, and abort any active scans */
4100 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
4101 IPW_DL_STATE | IPW_DL_ASSOC,
4102 "Missed beacon: %d - disassociate\n", missed_count);
4103 priv->status &= ~STATUS_ROAMING;
4104 if (priv->status & STATUS_SCANNING) {
4105 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
4106 IPW_DL_STATE,
4107 "Aborting scan with missed beacon.\n");
4108 queue_work(priv->workqueue, &priv->abort_scan);
4109 }
4110
4111 queue_work(priv->workqueue, &priv->disassociate);
4112 return;
4113 }
4114
4115 if (priv->status & STATUS_ROAMING) {
4116 /* If we are currently roaming, then just
4117 * print a debug statement... */
4118 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4119 "Missed beacon: %d - roam in progress\n",
4120 missed_count);
4121 return;
4122 }
4123
4124 if (missed_count > priv->roaming_threshold &&
4125 missed_count <= priv->disassociate_threshold) {
4126 /* If we are not already roaming, set the ROAM
4127 * bit in the status and kick off a scan.
4128 * This can happen several times before we reach
4129 * disassociate_threshold. */
4130 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
4131 "Missed beacon: %d - initiate "
4132 "roaming\n", missed_count);
4133 if (!(priv->status & STATUS_ROAMING)) {
4134 priv->status |= STATUS_ROAMING;
4135 if (!(priv->status & STATUS_SCANNING))
4136 queue_work(priv->workqueue,
4137 &priv->request_scan);
4138 }
4139 return;
4140 }
4141
4142 if (priv->status & STATUS_SCANNING) {
4143 /* Stop scan to keep fw from getting
4144 * stuck (only if we aren't roaming --
4145 * otherwise we'll never scan more than 2 or 3
4146 * channels..) */
4147 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF | IPW_DL_STATE,
4148 "Aborting scan with missed beacon.\n");
4149 queue_work(priv->workqueue, &priv->abort_scan);
4150 }
4151
4152 IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count);
4153
4154}
4155
3260/** 4156/**
3261 * Handle host notification packet. 4157 * Handle host notification packet.
3262 * Called from interrupt routine 4158 * Called from interrupt routine
@@ -3264,6 +4160,8 @@ static void ipw_gather_stats(struct ipw_priv *priv)
3264static inline void ipw_rx_notification(struct ipw_priv *priv, 4160static inline void ipw_rx_notification(struct ipw_priv *priv,
3265 struct ipw_rx_notification *notif) 4161 struct ipw_rx_notification *notif)
3266{ 4162{
4163 notif->size = le16_to_cpu(notif->size);
4164
3267 IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif->subtype, notif->size); 4165 IPW_DEBUG_NOTIF("type = %i (%d bytes)\n", notif->subtype, notif->size);
3268 4166
3269 switch (notif->subtype) { 4167 switch (notif->subtype) {
@@ -3307,30 +4205,44 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3307 4205
3308 priv->status &= ~STATUS_ASSOCIATING; 4206 priv->status &= ~STATUS_ASSOCIATING;
3309 priv->status |= STATUS_ASSOCIATED; 4207 priv->status |= STATUS_ASSOCIATED;
3310 4208 queue_work(priv->workqueue,
3311 netif_carrier_on(priv->net_dev); 4209 &priv->system_config);
3312 if (netif_queue_stopped(priv->net_dev)) { 4210
3313 IPW_DEBUG_NOTIF 4211#ifdef CONFIG_IPW_QOS
3314 ("waking queue\n"); 4212#define IPW_GET_PACKET_STYPE(x) WLAN_FC_GET_STYPE( \
3315 netif_wake_queue(priv->net_dev); 4213 le16_to_cpu(((struct ieee80211_hdr *)(x))->frame_ctl))
3316 } else { 4214 if ((priv->status & STATUS_AUTH) &&
3317 IPW_DEBUG_NOTIF 4215 (IPW_GET_PACKET_STYPE(&notif->u.raw)
3318 ("starting queue\n"); 4216 == IEEE80211_STYPE_ASSOC_RESP)) {
3319 netif_start_queue(priv-> 4217 if ((sizeof
3320 net_dev); 4218 (struct
4219 ieee80211_assoc_response)
4220 <= notif->size)
4221 && (notif->size <= 2314)) {
4222 struct
4223 ieee80211_rx_stats
4224 stats = {
4225 .len =
4226 notif->
4227 size - 1,
4228 };
4229
4230 IPW_DEBUG_QOS
4231 ("QoS Associate "
4232 "size %d\n",
4233 notif->size);
4234 ieee80211_rx_mgt(priv->
4235 ieee,
4236 (struct
4237 ieee80211_hdr_4addr
4238 *)
4239 &notif->u.raw, &stats);
4240 }
3321 } 4241 }
4242#endif
3322 4243
3323 ipw_reset_stats(priv); 4244 schedule_work(&priv->link_up);
3324 /* Ensure the rate is updated immediately */
3325 priv->last_rate =
3326 ipw_get_current_rate(priv);
3327 schedule_work(&priv->gather_stats);
3328 notify_wx_assoc_event(priv);
3329 4245
3330/* queue_delayed_work(priv->workqueue,
3331 &priv->request_scan,
3332 SCAN_ASSOCIATED_INTERVAL);
3333*/
3334 break; 4246 break;
3335 } 4247 }
3336 4248
@@ -3363,12 +4275,7 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3363 STATUS_AUTH | 4275 STATUS_AUTH |
3364 STATUS_ASSOCIATED); 4276 STATUS_ASSOCIATED);
3365 4277
3366 netif_carrier_off(priv-> 4278 schedule_work(&priv->link_down);
3367 net_dev);
3368 netif_stop_queue(priv->net_dev);
3369 queue_work(priv->workqueue,
3370 &priv->request_scan);
3371 notify_wx_assoc_event(priv);
3372 break; 4279 break;
3373 } 4280 }
3374 4281
@@ -3383,6 +4290,24 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3383 } 4290 }
3384 4291
3385 case CMAS_INIT:{ 4292 case CMAS_INIT:{
4293 if (priv->status & STATUS_AUTH) {
4294 struct
4295 ieee80211_assoc_response
4296 *resp;
4297 resp =
4298 (struct
4299 ieee80211_assoc_response
4300 *)&notif->u.raw;
4301 IPW_DEBUG(IPW_DL_NOTIF |
4302 IPW_DL_STATE |
4303 IPW_DL_ASSOC,
4304 "association failed (0x%04X): %s\n",
4305 ntohs(resp->status),
4306 ipw_get_status_code
4307 (ntohs
4308 (resp->status)));
4309 }
4310
3386 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | 4311 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
3387 IPW_DL_ASSOC, 4312 IPW_DL_ASSOC,
3388 "disassociated: '%s' " MAC_FMT 4313 "disassociated: '%s' " MAC_FMT
@@ -3395,35 +4320,21 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3395 ~(STATUS_DISASSOCIATING | 4320 ~(STATUS_DISASSOCIATING |
3396 STATUS_ASSOCIATING | 4321 STATUS_ASSOCIATING |
3397 STATUS_ASSOCIATED | STATUS_AUTH); 4322 STATUS_ASSOCIATED | STATUS_AUTH);
4323 if (priv->assoc_network
4324 && (priv->assoc_network->
4325 capability &
4326 WLAN_CAPABILITY_IBSS))
4327 ipw_remove_current_network
4328 (priv);
3398 4329
3399 netif_stop_queue(priv->net_dev); 4330 schedule_work(&priv->link_down);
3400 if (!(priv->status & STATUS_ROAMING)) {
3401 netif_carrier_off(priv->
3402 net_dev);
3403 notify_wx_assoc_event(priv);
3404
3405 /* Cancel any queued work ... */
3406 cancel_delayed_work(&priv->
3407 request_scan);
3408 cancel_delayed_work(&priv->
3409 adhoc_check);
3410
3411 /* Queue up another scan... */
3412 queue_work(priv->workqueue,
3413 &priv->request_scan);
3414
3415 cancel_delayed_work(&priv->
3416 gather_stats);
3417 } else {
3418 priv->status |= STATUS_ROAMING;
3419 queue_work(priv->workqueue,
3420 &priv->request_scan);
3421 }
3422 4331
3423 ipw_reset_stats(priv);
3424 break; 4332 break;
3425 } 4333 }
3426 4334
4335 case CMAS_RX_ASSOC_RESP:
4336 break;
4337
3427 default: 4338 default:
3428 IPW_ERROR("assoc: unknown (%d)\n", 4339 IPW_ERROR("assoc: unknown (%d)\n",
3429 assoc->state); 4340 assoc->state);
@@ -3466,11 +4377,7 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3466 STATUS_AUTH | 4377 STATUS_AUTH |
3467 STATUS_ASSOCIATED); 4378 STATUS_ASSOCIATED);
3468 4379
3469 netif_carrier_off(priv->net_dev); 4380 schedule_work(&priv->link_down);
3470 netif_stop_queue(priv->net_dev);
3471 queue_work(priv->workqueue,
3472 &priv->request_scan);
3473 notify_wx_assoc_event(priv);
3474 break; 4381 break;
3475 4382
3476 case CMAS_TX_AUTH_SEQ_1: 4383 case CMAS_TX_AUTH_SEQ_1:
@@ -3512,6 +4419,7 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3512 case CMAS_RX_ASSOC_RESP: 4419 case CMAS_RX_ASSOC_RESP:
3513 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | 4420 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
3514 IPW_DL_ASSOC, "RX_ASSOC_RESP\n"); 4421 IPW_DL_ASSOC, "RX_ASSOC_RESP\n");
4422
3515 break; 4423 break;
3516 case CMAS_ASSOCIATED: 4424 case CMAS_ASSOCIATED:
3517 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | 4425 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE |
@@ -3556,43 +4464,67 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3556 priv->status &= 4464 priv->status &=
3557 ~(STATUS_SCANNING | STATUS_SCAN_ABORTING); 4465 ~(STATUS_SCANNING | STATUS_SCAN_ABORTING);
3558 4466
4467 wake_up_interruptible(&priv->wait_state);
3559 cancel_delayed_work(&priv->scan_check); 4468 cancel_delayed_work(&priv->scan_check);
3560 4469
4470 if (priv->status & STATUS_EXIT_PENDING)
4471 break;
4472
4473 priv->ieee->scans++;
4474
4475#ifdef CONFIG_IPW2200_MONITOR
4476 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
4477 priv->status |= STATUS_SCAN_FORCED;
4478 queue_work(priv->workqueue,
4479 &priv->request_scan);
4480 break;
4481 }
4482 priv->status &= ~STATUS_SCAN_FORCED;
4483#endif /* CONFIG_IPW2200_MONITOR */
4484
3561 if (!(priv->status & (STATUS_ASSOCIATED | 4485 if (!(priv->status & (STATUS_ASSOCIATED |
3562 STATUS_ASSOCIATING | 4486 STATUS_ASSOCIATING |
3563 STATUS_ROAMING | 4487 STATUS_ROAMING |
3564 STATUS_DISASSOCIATING))) 4488 STATUS_DISASSOCIATING)))
3565 queue_work(priv->workqueue, &priv->associate); 4489 queue_work(priv->workqueue, &priv->associate);
3566 else if (priv->status & STATUS_ROAMING) { 4490 else if (priv->status & STATUS_ROAMING) {
3567 /* If a scan completed and we are in roam mode, then 4491 if (x->status == SCAN_COMPLETED_STATUS_COMPLETE)
3568 * the scan that completed was the one requested as a 4492 /* If a scan completed and we are in roam mode, then
3569 * result of entering roam... so, schedule the 4493 * the scan that completed was the one requested as a
3570 * roam work */ 4494 * result of entering roam... so, schedule the
3571 queue_work(priv->workqueue, &priv->roam); 4495 * roam work */
4496 queue_work(priv->workqueue,
4497 &priv->roam);
4498 else
4499 /* Don't schedule if we aborted the scan */
4500 priv->status &= ~STATUS_ROAMING;
3572 } else if (priv->status & STATUS_SCAN_PENDING) 4501 } else if (priv->status & STATUS_SCAN_PENDING)
3573 queue_work(priv->workqueue, 4502 queue_work(priv->workqueue,
3574 &priv->request_scan); 4503 &priv->request_scan);
3575 4504 else if (priv->config & CFG_BACKGROUND_SCAN
3576 priv->ieee->scans++; 4505 && priv->status & STATUS_ASSOCIATED)
4506 queue_delayed_work(priv->workqueue,
4507 &priv->request_scan, HZ);
3577 break; 4508 break;
3578 } 4509 }
3579 4510
3580 case HOST_NOTIFICATION_STATUS_FRAG_LENGTH:{ 4511 case HOST_NOTIFICATION_STATUS_FRAG_LENGTH:{
3581 struct notif_frag_length *x = &notif->u.frag_len; 4512 struct notif_frag_length *x = &notif->u.frag_len;
3582 4513
3583 if (notif->size == sizeof(*x)) { 4514 if (notif->size == sizeof(*x))
3584 IPW_ERROR("Frag length: %d\n", x->frag_length); 4515 IPW_ERROR("Frag length: %d\n",
3585 } else { 4516 le16_to_cpu(x->frag_length));
4517 else
3586 IPW_ERROR("Frag length of wrong size %d " 4518 IPW_ERROR("Frag length of wrong size %d "
3587 "(should be %zd)\n", 4519 "(should be %zd)\n",
3588 notif->size, sizeof(*x)); 4520 notif->size, sizeof(*x));
3589 }
3590 break; 4521 break;
3591 } 4522 }
3592 4523
3593 case HOST_NOTIFICATION_STATUS_LINK_DETERIORATION:{ 4524 case HOST_NOTIFICATION_STATUS_LINK_DETERIORATION:{
3594 struct notif_link_deterioration *x = 4525 struct notif_link_deterioration *x =
3595 &notif->u.link_deterioration; 4526 &notif->u.link_deterioration;
4527
3596 if (notif->size == sizeof(*x)) { 4528 if (notif->size == sizeof(*x)) {
3597 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE, 4529 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
3598 "link deterioration: '%s' " MAC_FMT 4530 "link deterioration: '%s' " MAC_FMT
@@ -3612,11 +4544,9 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3612 case HOST_NOTIFICATION_DINO_CONFIG_RESPONSE:{ 4544 case HOST_NOTIFICATION_DINO_CONFIG_RESPONSE:{
3613 IPW_ERROR("Dino config\n"); 4545 IPW_ERROR("Dino config\n");
3614 if (priv->hcmd 4546 if (priv->hcmd
3615 && priv->hcmd->cmd == HOST_CMD_DINO_CONFIG) { 4547 && priv->hcmd->cmd != HOST_CMD_DINO_CONFIG)
3616 /* TODO: Do anything special? */
3617 } else {
3618 IPW_ERROR("Unexpected DINO_CONFIG_RESPONSE\n"); 4548 IPW_ERROR("Unexpected DINO_CONFIG_RESPONSE\n");
3619 } 4549
3620 break; 4550 break;
3621 } 4551 }
3622 4552
@@ -3629,36 +4559,11 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3629 break; 4559 break;
3630 } 4560 }
3631 4561
3632 if (x->state == HOST_NOTIFICATION_STATUS_BEACON_MISSING) { 4562 if (le32_to_cpu(x->state) ==
3633 if (priv->status & STATUS_SCANNING) { 4563 HOST_NOTIFICATION_STATUS_BEACON_MISSING)
3634 /* Stop scan to keep fw from getting 4564 ipw_handle_missed_beacon(priv,
3635 * stuck... */ 4565 le32_to_cpu(x->
3636 queue_work(priv->workqueue, 4566 number));
3637 &priv->abort_scan);
3638 }
3639
3640 if (x->number > priv->missed_beacon_threshold &&
3641 priv->status & STATUS_ASSOCIATED) {
3642 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
3643 IPW_DL_STATE,
3644 "Missed beacon: %d - disassociate\n",
3645 x->number);
3646 queue_work(priv->workqueue,
3647 &priv->disassociate);
3648 } else if (x->number > priv->roaming_threshold) {
3649 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
3650 "Missed beacon: %d - initiate "
3651 "roaming\n", x->number);
3652 queue_work(priv->workqueue,
3653 &priv->roam);
3654 } else {
3655 IPW_DEBUG_NOTIF("Missed beacon: %d\n",
3656 x->number);
3657 }
3658
3659 priv->notif_missed_beacons = x->number;
3660
3661 }
3662 4567
3663 break; 4568 break;
3664 } 4569 }
@@ -3697,7 +4602,8 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
3697 case HOST_NOTIFICATION_NOISE_STATS:{ 4602 case HOST_NOTIFICATION_NOISE_STATS:{
3698 if (notif->size == sizeof(u32)) { 4603 if (notif->size == sizeof(u32)) {
3699 priv->last_noise = 4604 priv->last_noise =
3700 (u8) (notif->u.noise.value & 0xff); 4605 (u8) (le32_to_cpu(notif->u.noise.value) &
4606 0xff);
3701 average_add(&priv->average_noise, 4607 average_add(&priv->average_noise,
3702 priv->last_noise); 4608 priv->last_noise);
3703 break; 4609 break;
@@ -3730,43 +4636,43 @@ static int ipw_queue_reset(struct ipw_priv *priv)
3730 ipw_tx_queue_free(priv); 4636 ipw_tx_queue_free(priv);
3731 /* Tx CMD queue */ 4637 /* Tx CMD queue */
3732 rc = ipw_queue_tx_init(priv, &priv->txq_cmd, nTxCmd, 4638 rc = ipw_queue_tx_init(priv, &priv->txq_cmd, nTxCmd,
3733 CX2_TX_CMD_QUEUE_READ_INDEX, 4639 IPW_TX_CMD_QUEUE_READ_INDEX,
3734 CX2_TX_CMD_QUEUE_WRITE_INDEX, 4640 IPW_TX_CMD_QUEUE_WRITE_INDEX,
3735 CX2_TX_CMD_QUEUE_BD_BASE, 4641 IPW_TX_CMD_QUEUE_BD_BASE,
3736 CX2_TX_CMD_QUEUE_BD_SIZE); 4642 IPW_TX_CMD_QUEUE_BD_SIZE);
3737 if (rc) { 4643 if (rc) {
3738 IPW_ERROR("Tx Cmd queue init failed\n"); 4644 IPW_ERROR("Tx Cmd queue init failed\n");
3739 goto error; 4645 goto error;
3740 } 4646 }
3741 /* Tx queue(s) */ 4647 /* Tx queue(s) */
3742 rc = ipw_queue_tx_init(priv, &priv->txq[0], nTx, 4648 rc = ipw_queue_tx_init(priv, &priv->txq[0], nTx,
3743 CX2_TX_QUEUE_0_READ_INDEX, 4649 IPW_TX_QUEUE_0_READ_INDEX,
3744 CX2_TX_QUEUE_0_WRITE_INDEX, 4650 IPW_TX_QUEUE_0_WRITE_INDEX,
3745 CX2_TX_QUEUE_0_BD_BASE, CX2_TX_QUEUE_0_BD_SIZE); 4651 IPW_TX_QUEUE_0_BD_BASE, IPW_TX_QUEUE_0_BD_SIZE);
3746 if (rc) { 4652 if (rc) {
3747 IPW_ERROR("Tx 0 queue init failed\n"); 4653 IPW_ERROR("Tx 0 queue init failed\n");
3748 goto error; 4654 goto error;
3749 } 4655 }
3750 rc = ipw_queue_tx_init(priv, &priv->txq[1], nTx, 4656 rc = ipw_queue_tx_init(priv, &priv->txq[1], nTx,
3751 CX2_TX_QUEUE_1_READ_INDEX, 4657 IPW_TX_QUEUE_1_READ_INDEX,
3752 CX2_TX_QUEUE_1_WRITE_INDEX, 4658 IPW_TX_QUEUE_1_WRITE_INDEX,
3753 CX2_TX_QUEUE_1_BD_BASE, CX2_TX_QUEUE_1_BD_SIZE); 4659 IPW_TX_QUEUE_1_BD_BASE, IPW_TX_QUEUE_1_BD_SIZE);
3754 if (rc) { 4660 if (rc) {
3755 IPW_ERROR("Tx 1 queue init failed\n"); 4661 IPW_ERROR("Tx 1 queue init failed\n");
3756 goto error; 4662 goto error;
3757 } 4663 }
3758 rc = ipw_queue_tx_init(priv, &priv->txq[2], nTx, 4664 rc = ipw_queue_tx_init(priv, &priv->txq[2], nTx,
3759 CX2_TX_QUEUE_2_READ_INDEX, 4665 IPW_TX_QUEUE_2_READ_INDEX,
3760 CX2_TX_QUEUE_2_WRITE_INDEX, 4666 IPW_TX_QUEUE_2_WRITE_INDEX,
3761 CX2_TX_QUEUE_2_BD_BASE, CX2_TX_QUEUE_2_BD_SIZE); 4667 IPW_TX_QUEUE_2_BD_BASE, IPW_TX_QUEUE_2_BD_SIZE);
3762 if (rc) { 4668 if (rc) {
3763 IPW_ERROR("Tx 2 queue init failed\n"); 4669 IPW_ERROR("Tx 2 queue init failed\n");
3764 goto error; 4670 goto error;
3765 } 4671 }
3766 rc = ipw_queue_tx_init(priv, &priv->txq[3], nTx, 4672 rc = ipw_queue_tx_init(priv, &priv->txq[3], nTx,
3767 CX2_TX_QUEUE_3_READ_INDEX, 4673 IPW_TX_QUEUE_3_READ_INDEX,
3768 CX2_TX_QUEUE_3_WRITE_INDEX, 4674 IPW_TX_QUEUE_3_WRITE_INDEX,
3769 CX2_TX_QUEUE_3_BD_BASE, CX2_TX_QUEUE_3_BD_SIZE); 4675 IPW_TX_QUEUE_3_BD_BASE, IPW_TX_QUEUE_3_BD_SIZE);
3770 if (rc) { 4676 if (rc) {
3771 IPW_ERROR("Tx 3 queue init failed\n"); 4677 IPW_ERROR("Tx 3 queue init failed\n");
3772 goto error; 4678 goto error;
@@ -3814,9 +4720,10 @@ static int ipw_queue_tx_reclaim(struct ipw_priv *priv,
3814 priv->tx_packets++; 4720 priv->tx_packets++;
3815 } 4721 }
3816 done: 4722 done:
3817 if (ipw_queue_space(q) > q->low_mark && qindex >= 0) { 4723 if ((ipw_queue_space(q) > q->low_mark) &&
3818 __maybe_wake_tx(priv); 4724 (qindex >= 0) &&
3819 } 4725 (priv->status & STATUS_ASSOCIATED) && netif_running(priv->net_dev))
4726 netif_wake_queue(priv->net_dev);
3820 used = q->first_empty - q->last_used; 4727 used = q->first_empty - q->last_used;
3821 if (used < 0) 4728 if (used < 0)
3822 used += q->n_bd; 4729 used += q->n_bd;
@@ -3857,7 +4764,7 @@ static int ipw_queue_tx_hcmd(struct ipw_priv *priv, int hcmd, void *buf,
3857 * Rx theory of operation 4764 * Rx theory of operation
3858 * 4765 *
3859 * The host allocates 32 DMA target addresses and passes the host address 4766 * The host allocates 32 DMA target addresses and passes the host address
3860 * to the firmware at register CX2_RFDS_TABLE_LOWER + N * RFD_SIZE where N is 4767 * to the firmware at register IPW_RFDS_TABLE_LOWER + N * RFD_SIZE where N is
3861 * 0 to 31 4768 * 0 to 31
3862 * 4769 *
3863 * Rx Queue Indexes 4770 * Rx Queue Indexes
@@ -3941,7 +4848,7 @@ static void ipw_rx_queue_restock(struct ipw_priv *priv)
3941 rxb = list_entry(element, struct ipw_rx_mem_buffer, list); 4848 rxb = list_entry(element, struct ipw_rx_mem_buffer, list);
3942 list_del(element); 4849 list_del(element);
3943 4850
3944 ipw_write32(priv, CX2_RFDS_TABLE_LOWER + rxq->write * RFD_SIZE, 4851 ipw_write32(priv, IPW_RFDS_TABLE_LOWER + rxq->write * RFD_SIZE,
3945 rxb->dma_addr); 4852 rxb->dma_addr);
3946 rxq->queue[rxq->write] = rxb; 4853 rxq->queue[rxq->write] = rxb;
3947 rxq->write = (rxq->write + 1) % RX_QUEUE_SIZE; 4854 rxq->write = (rxq->write + 1) % RX_QUEUE_SIZE;
@@ -3956,7 +4863,7 @@ static void ipw_rx_queue_restock(struct ipw_priv *priv)
3956 4863
3957 /* If we've added more space for the firmware to place data, tell it */ 4864 /* If we've added more space for the firmware to place data, tell it */
3958 if (write != rxq->write) 4865 if (write != rxq->write)
3959 ipw_write32(priv, CX2_RX_WRITE_INDEX, rxq->write); 4866 ipw_write32(priv, IPW_RX_WRITE_INDEX, rxq->write);
3960} 4867}
3961 4868
3962/* 4869/*
@@ -3977,7 +4884,7 @@ static void ipw_rx_queue_replenish(void *data)
3977 while (!list_empty(&rxq->rx_used)) { 4884 while (!list_empty(&rxq->rx_used)) {
3978 element = rxq->rx_used.next; 4885 element = rxq->rx_used.next;
3979 rxb = list_entry(element, struct ipw_rx_mem_buffer, list); 4886 rxb = list_entry(element, struct ipw_rx_mem_buffer, list);
3980 rxb->skb = alloc_skb(CX2_RX_BUF_SIZE, GFP_ATOMIC); 4887 rxb->skb = alloc_skb(IPW_RX_BUF_SIZE, GFP_ATOMIC);
3981 if (!rxb->skb) { 4888 if (!rxb->skb) {
3982 printk(KERN_CRIT "%s: Can not allocate SKB buffers.\n", 4889 printk(KERN_CRIT "%s: Can not allocate SKB buffers.\n",
3983 priv->net_dev->name); 4890 priv->net_dev->name);
@@ -3991,7 +4898,7 @@ static void ipw_rx_queue_replenish(void *data)
3991 rxb->rxb = (struct ipw_rx_buffer *)rxb->skb->data; 4898 rxb->rxb = (struct ipw_rx_buffer *)rxb->skb->data;
3992 rxb->dma_addr = 4899 rxb->dma_addr =
3993 pci_map_single(priv->pci_dev, rxb->skb->data, 4900 pci_map_single(priv->pci_dev, rxb->skb->data,
3994 CX2_RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 4901 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
3995 4902
3996 list_add_tail(&rxb->list, &rxq->rx_free); 4903 list_add_tail(&rxb->list, &rxq->rx_free);
3997 rxq->free_count++; 4904 rxq->free_count++;
@@ -4001,6 +4908,14 @@ static void ipw_rx_queue_replenish(void *data)
4001 ipw_rx_queue_restock(priv); 4908 ipw_rx_queue_restock(priv);
4002} 4909}
4003 4910
4911static void ipw_bg_rx_queue_replenish(void *data)
4912{
4913 struct ipw_priv *priv = data;
4914 down(&priv->sem);
4915 ipw_rx_queue_replenish(data);
4916 up(&priv->sem);
4917}
4918
4004/* Assumes that the skb field of the buffers in 'pool' is kept accurate. 4919/* Assumes that the skb field of the buffers in 'pool' is kept accurate.
4005 * If an SKB has been detached, the POOL needs to have it's SKB set to NULL 4920 * If an SKB has been detached, the POOL needs to have it's SKB set to NULL
4006 * This free routine walks the list of POOL entries and if SKB is set to 4921 * This free routine walks the list of POOL entries and if SKB is set to
@@ -4016,7 +4931,7 @@ static void ipw_rx_queue_free(struct ipw_priv *priv, struct ipw_rx_queue *rxq)
4016 for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { 4931 for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
4017 if (rxq->pool[i].skb != NULL) { 4932 if (rxq->pool[i].skb != NULL) {
4018 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr, 4933 pci_unmap_single(priv->pci_dev, rxq->pool[i].dma_addr,
4019 CX2_RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 4934 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
4020 dev_kfree_skb(rxq->pool[i].skb); 4935 dev_kfree_skb(rxq->pool[i].skb);
4021 } 4936 }
4022 } 4937 }
@@ -4135,8 +5050,18 @@ static int ipw_compatible_rates(struct ipw_priv *priv,
4135 num_rates = min(network->rates_len, (u8) IPW_MAX_RATES); 5050 num_rates = min(network->rates_len, (u8) IPW_MAX_RATES);
4136 rates->num_rates = 0; 5051 rates->num_rates = 0;
4137 for (i = 0; i < num_rates; i++) { 5052 for (i = 0; i < num_rates; i++) {
4138 if (!ipw_is_rate_in_mask 5053 if (!ipw_is_rate_in_mask(priv, network->mode,
4139 (priv, network->mode, network->rates[i])) { 5054 network->rates[i])) {
5055
5056 if (network->rates[i] & IEEE80211_BASIC_RATE_MASK) {
5057 IPW_DEBUG_SCAN("Adding masked mandatory "
5058 "rate %02X\n",
5059 network->rates[i]);
5060 rates->supported_rates[rates->num_rates++] =
5061 network->rates[i];
5062 continue;
5063 }
5064
4140 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n", 5065 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
4141 network->rates[i], priv->rates_mask); 5066 network->rates[i], priv->rates_mask);
4142 continue; 5067 continue;
@@ -4145,11 +5070,20 @@ static int ipw_compatible_rates(struct ipw_priv *priv,
4145 rates->supported_rates[rates->num_rates++] = network->rates[i]; 5070 rates->supported_rates[rates->num_rates++] = network->rates[i];
4146 } 5071 }
4147 5072
4148 num_rates = 5073 num_rates = min(network->rates_ex_len,
4149 min(network->rates_ex_len, (u8) (IPW_MAX_RATES - num_rates)); 5074 (u8) (IPW_MAX_RATES - num_rates));
4150 for (i = 0; i < num_rates; i++) { 5075 for (i = 0; i < num_rates; i++) {
4151 if (!ipw_is_rate_in_mask 5076 if (!ipw_is_rate_in_mask(priv, network->mode,
4152 (priv, network->mode, network->rates_ex[i])) { 5077 network->rates_ex[i])) {
5078 if (network->rates_ex[i] & IEEE80211_BASIC_RATE_MASK) {
5079 IPW_DEBUG_SCAN("Adding masked mandatory "
5080 "rate %02X\n",
5081 network->rates_ex[i]);
5082 rates->supported_rates[rates->num_rates++] =
5083 network->rates[i];
5084 continue;
5085 }
5086
4153 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n", 5087 IPW_DEBUG_SCAN("Rate %02X masked : 0x%08X\n",
4154 network->rates_ex[i], priv->rates_mask); 5088 network->rates_ex[i], priv->rates_mask);
4155 continue; 5089 continue;
@@ -4159,7 +5093,7 @@ static int ipw_compatible_rates(struct ipw_priv *priv,
4159 network->rates_ex[i]; 5093 network->rates_ex[i];
4160 } 5094 }
4161 5095
4162 return rates->num_rates; 5096 return 1;
4163} 5097}
4164 5098
4165static inline void ipw_copy_rates(struct ipw_supported_rates *dest, 5099static inline void ipw_copy_rates(struct ipw_supported_rates *dest,
@@ -4241,6 +5175,216 @@ struct ipw_network_match {
4241 struct ipw_supported_rates rates; 5175 struct ipw_supported_rates rates;
4242}; 5176};
4243 5177
5178static int ipw_find_adhoc_network(struct ipw_priv *priv,
5179 struct ipw_network_match *match,
5180 struct ieee80211_network *network,
5181 int roaming)
5182{
5183 struct ipw_supported_rates rates;
5184
5185 /* Verify that this network's capability is compatible with the
5186 * current mode (AdHoc or Infrastructure) */
5187 if ((priv->ieee->iw_mode == IW_MODE_ADHOC &&
5188 !(network->capability & WLAN_CAPABILITY_IBSS))) {
5189 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded due to "
5190 "capability mismatch.\n",
5191 escape_essid(network->ssid, network->ssid_len),
5192 MAC_ARG(network->bssid));
5193 return 0;
5194 }
5195
5196 /* If we do not have an ESSID for this AP, we can not associate with
5197 * it */
5198 if (network->flags & NETWORK_EMPTY_ESSID) {
5199 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5200 "because of hidden ESSID.\n",
5201 escape_essid(network->ssid, network->ssid_len),
5202 MAC_ARG(network->bssid));
5203 return 0;
5204 }
5205
5206 if (unlikely(roaming)) {
5207 /* If we are roaming, then ensure check if this is a valid
5208 * network to try and roam to */
5209 if ((network->ssid_len != match->network->ssid_len) ||
5210 memcmp(network->ssid, match->network->ssid,
5211 network->ssid_len)) {
5212 IPW_DEBUG_MERGE("Netowrk '%s (" MAC_FMT ")' excluded "
5213 "because of non-network ESSID.\n",
5214 escape_essid(network->ssid,
5215 network->ssid_len),
5216 MAC_ARG(network->bssid));
5217 return 0;
5218 }
5219 } else {
5220 /* If an ESSID has been configured then compare the broadcast
5221 * ESSID to ours */
5222 if ((priv->config & CFG_STATIC_ESSID) &&
5223 ((network->ssid_len != priv->essid_len) ||
5224 memcmp(network->ssid, priv->essid,
5225 min(network->ssid_len, priv->essid_len)))) {
5226 char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
5227
5228 strncpy(escaped,
5229 escape_essid(network->ssid, network->ssid_len),
5230 sizeof(escaped));
5231 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5232 "because of ESSID mismatch: '%s'.\n",
5233 escaped, MAC_ARG(network->bssid),
5234 escape_essid(priv->essid,
5235 priv->essid_len));
5236 return 0;
5237 }
5238 }
5239
5240 /* If the old network rate is better than this one, don't bother
5241 * testing everything else. */
5242
5243 if (network->time_stamp[0] < match->network->time_stamp[0]) {
5244 IPW_DEBUG_MERGE("Network '%s excluded because newer than "
5245 "current network.\n",
5246 escape_essid(match->network->ssid,
5247 match->network->ssid_len));
5248 return 0;
5249 } else if (network->time_stamp[1] < match->network->time_stamp[1]) {
5250 IPW_DEBUG_MERGE("Network '%s excluded because newer than "
5251 "current network.\n",
5252 escape_essid(match->network->ssid,
5253 match->network->ssid_len));
5254 return 0;
5255 }
5256
5257 /* Now go through and see if the requested network is valid... */
5258 if (priv->ieee->scan_age != 0 &&
5259 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) {
5260 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5261 "because of age: %lums.\n",
5262 escape_essid(network->ssid, network->ssid_len),
5263 MAC_ARG(network->bssid),
5264 1000 * (jiffies - network->last_scanned) / HZ);
5265 return 0;
5266 }
5267
5268 if ((priv->config & CFG_STATIC_CHANNEL) &&
5269 (network->channel != priv->channel)) {
5270 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5271 "because of channel mismatch: %d != %d.\n",
5272 escape_essid(network->ssid, network->ssid_len),
5273 MAC_ARG(network->bssid),
5274 network->channel, priv->channel);
5275 return 0;
5276 }
5277
5278 /* Verify privacy compatability */
5279 if (((priv->capability & CAP_PRIVACY_ON) ? 1 : 0) !=
5280 ((network->capability & WLAN_CAPABILITY_PRIVACY) ? 1 : 0)) {
5281 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5282 "because of privacy mismatch: %s != %s.\n",
5283 escape_essid(network->ssid, network->ssid_len),
5284 MAC_ARG(network->bssid),
5285 priv->
5286 capability & CAP_PRIVACY_ON ? "on" : "off",
5287 network->
5288 capability & WLAN_CAPABILITY_PRIVACY ? "on" :
5289 "off");
5290 return 0;
5291 }
5292
5293 if (!memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
5294 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5295 "because of the same BSSID match: " MAC_FMT
5296 ".\n", escape_essid(network->ssid,
5297 network->ssid_len),
5298 MAC_ARG(network->bssid), MAC_ARG(priv->bssid));
5299 return 0;
5300 }
5301
5302 /* Filter out any incompatible freq / mode combinations */
5303 if (!ieee80211_is_valid_mode(priv->ieee, network->mode)) {
5304 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5305 "because of invalid frequency/mode "
5306 "combination.\n",
5307 escape_essid(network->ssid, network->ssid_len),
5308 MAC_ARG(network->bssid));
5309 return 0;
5310 }
5311
5312 /* Ensure that the rates supported by the driver are compatible with
5313 * this AP, including verification of basic rates (mandatory) */
5314 if (!ipw_compatible_rates(priv, network, &rates)) {
5315 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5316 "because configured rate mask excludes "
5317 "AP mandatory rate.\n",
5318 escape_essid(network->ssid, network->ssid_len),
5319 MAC_ARG(network->bssid));
5320 return 0;
5321 }
5322
5323 if (rates.num_rates == 0) {
5324 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded "
5325 "because of no compatible rates.\n",
5326 escape_essid(network->ssid, network->ssid_len),
5327 MAC_ARG(network->bssid));
5328 return 0;
5329 }
5330
5331 /* TODO: Perform any further minimal comparititive tests. We do not
5332 * want to put too much policy logic here; intelligent scan selection
5333 * should occur within a generic IEEE 802.11 user space tool. */
5334
5335 /* Set up 'new' AP to this network */
5336 ipw_copy_rates(&match->rates, &rates);
5337 match->network = network;
5338 IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' is a viable match.\n",
5339 escape_essid(network->ssid, network->ssid_len),
5340 MAC_ARG(network->bssid));
5341
5342 return 1;
5343}
5344
5345static void ipw_merge_adhoc_network(void *data)
5346{
5347 struct ipw_priv *priv = data;
5348 struct ieee80211_network *network = NULL;
5349 struct ipw_network_match match = {
5350 .network = priv->assoc_network
5351 };
5352
5353 if ((priv->status & STATUS_ASSOCIATED) &&
5354 (priv->ieee->iw_mode == IW_MODE_ADHOC)) {
5355 /* First pass through ROAM process -- look for a better
5356 * network */
5357 unsigned long flags;
5358
5359 spin_lock_irqsave(&priv->ieee->lock, flags);
5360 list_for_each_entry(network, &priv->ieee->network_list, list) {
5361 if (network != priv->assoc_network)
5362 ipw_find_adhoc_network(priv, &match, network,
5363 1);
5364 }
5365 spin_unlock_irqrestore(&priv->ieee->lock, flags);
5366
5367 if (match.network == priv->assoc_network) {
5368 IPW_DEBUG_MERGE("No better ADHOC in this network to "
5369 "merge to.\n");
5370 return;
5371 }
5372
5373 down(&priv->sem);
5374 if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) {
5375 IPW_DEBUG_MERGE("remove network %s\n",
5376 escape_essid(priv->essid,
5377 priv->essid_len));
5378 ipw_remove_current_network(priv);
5379 }
5380
5381 ipw_disassociate(priv);
5382 priv->assoc_network = match.network;
5383 up(&priv->sem);
5384 return;
5385 }
5386}
5387
4244static int ipw_best_network(struct ipw_priv *priv, 5388static int ipw_best_network(struct ipw_priv *priv,
4245 struct ipw_network_match *match, 5389 struct ipw_network_match *match,
4246 struct ieee80211_network *network, int roaming) 5390 struct ieee80211_network *network, int roaming)
@@ -4322,9 +5466,9 @@ static int ipw_best_network(struct ipw_priv *priv,
4322 /* If this network has already had an association attempt within the 5466 /* If this network has already had an association attempt within the
4323 * last 3 seconds, do not try and associate again... */ 5467 * last 3 seconds, do not try and associate again... */
4324 if (network->last_associate && 5468 if (network->last_associate &&
4325 time_after(network->last_associate + (HZ * 5UL), jiffies)) { 5469 time_after(network->last_associate + (HZ * 3UL), jiffies)) {
4326 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " 5470 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
4327 "because of storming (%lu since last " 5471 "because of storming (%lus since last "
4328 "assoc attempt).\n", 5472 "assoc attempt).\n",
4329 escape_essid(network->ssid, network->ssid_len), 5473 escape_essid(network->ssid, network->ssid_len),
4330 MAC_ARG(network->bssid), 5474 MAC_ARG(network->bssid),
@@ -4334,12 +5478,12 @@ static int ipw_best_network(struct ipw_priv *priv,
4334 5478
4335 /* Now go through and see if the requested network is valid... */ 5479 /* Now go through and see if the requested network is valid... */
4336 if (priv->ieee->scan_age != 0 && 5480 if (priv->ieee->scan_age != 0 &&
4337 jiffies - network->last_scanned > priv->ieee->scan_age) { 5481 time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) {
4338 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " 5482 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
4339 "because of age: %lums.\n", 5483 "because of age: %lums.\n",
4340 escape_essid(network->ssid, network->ssid_len), 5484 escape_essid(network->ssid, network->ssid_len),
4341 MAC_ARG(network->bssid), 5485 MAC_ARG(network->bssid),
4342 (jiffies - network->last_scanned) / (HZ / 100)); 5486 1000 * (jiffies - network->last_scanned) / HZ);
4343 return 0; 5487 return 0;
4344 } 5488 }
4345 5489
@@ -4367,6 +5511,15 @@ static int ipw_best_network(struct ipw_priv *priv,
4367 return 0; 5511 return 0;
4368 } 5512 }
4369 5513
5514 if (!priv->ieee->wpa_enabled && (network->wpa_ie_len > 0 ||
5515 network->rsn_ie_len > 0)) {
5516 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5517 "because of WPA capability mismatch.\n",
5518 escape_essid(network->ssid, network->ssid_len),
5519 MAC_ARG(network->bssid));
5520 return 0;
5521 }
5522
4370 if ((priv->config & CFG_STATIC_BSSID) && 5523 if ((priv->config & CFG_STATIC_BSSID) &&
4371 memcmp(network->bssid, priv->bssid, ETH_ALEN)) { 5524 memcmp(network->bssid, priv->bssid, ETH_ALEN)) {
4372 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " 5525 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
@@ -4386,7 +5539,26 @@ static int ipw_best_network(struct ipw_priv *priv,
4386 return 0; 5539 return 0;
4387 } 5540 }
4388 5541
4389 ipw_compatible_rates(priv, network, &rates); 5542 /* Filter out invalid channel in current GEO */
5543 if (!ipw_is_valid_channel(priv->ieee, network->channel)) {
5544 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5545 "because of invalid channel in current GEO\n",
5546 escape_essid(network->ssid, network->ssid_len),
5547 MAC_ARG(network->bssid));
5548 return 0;
5549 }
5550
5551 /* Ensure that the rates supported by the driver are compatible with
5552 * this AP, including verification of basic rates (mandatory) */
5553 if (!ipw_compatible_rates(priv, network, &rates)) {
5554 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
5555 "because configured rate mask excludes "
5556 "AP mandatory rate.\n",
5557 escape_essid(network->ssid, network->ssid_len),
5558 MAC_ARG(network->bssid));
5559 return 0;
5560 }
5561
4390 if (rates.num_rates == 0) { 5562 if (rates.num_rates == 0) {
4391 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " 5563 IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded "
4392 "because of no compatible rates.\n", 5564 "because of no compatible rates.\n",
@@ -4413,6 +5585,9 @@ static int ipw_best_network(struct ipw_priv *priv,
4413static void ipw_adhoc_create(struct ipw_priv *priv, 5585static void ipw_adhoc_create(struct ipw_priv *priv,
4414 struct ieee80211_network *network) 5586 struct ieee80211_network *network)
4415{ 5587{
5588 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
5589 int i;
5590
4416 /* 5591 /*
4417 * For the purposes of scanning, we can set our wireless mode 5592 * For the purposes of scanning, we can set our wireless mode
4418 * to trigger scans across combinations of bands, but when it 5593 * to trigger scans across combinations of bands, but when it
@@ -4423,22 +5598,47 @@ static void ipw_adhoc_create(struct ipw_priv *priv,
4423 * chossen band. Attempting to create a new ad-hoc network 5598 * chossen band. Attempting to create a new ad-hoc network
4424 * with an invalid channel for wireless mode will trigger a 5599 * with an invalid channel for wireless mode will trigger a
4425 * FW fatal error. 5600 * FW fatal error.
5601 *
4426 */ 5602 */
4427 network->mode = is_valid_channel(priv->ieee->mode, priv->channel); 5603 switch (ipw_is_valid_channel(priv->ieee, priv->channel)) {
4428 if (network->mode) { 5604 case IEEE80211_52GHZ_BAND:
4429 network->channel = priv->channel; 5605 network->mode = IEEE_A;
4430 } else { 5606 i = ipw_channel_to_index(priv->ieee, priv->channel);
5607 if (i == -1)
5608 BUG();
5609 if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) {
5610 IPW_WARNING("Overriding invalid channel\n");
5611 priv->channel = geo->a[0].channel;
5612 }
5613 break;
5614
5615 case IEEE80211_24GHZ_BAND:
5616 if (priv->ieee->mode & IEEE_G)
5617 network->mode = IEEE_G;
5618 else
5619 network->mode = IEEE_B;
5620 i = ipw_channel_to_index(priv->ieee, priv->channel);
5621 if (i == -1)
5622 BUG();
5623 if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) {
5624 IPW_WARNING("Overriding invalid channel\n");
5625 priv->channel = geo->bg[0].channel;
5626 }
5627 break;
5628
5629 default:
4431 IPW_WARNING("Overriding invalid channel\n"); 5630 IPW_WARNING("Overriding invalid channel\n");
4432 if (priv->ieee->mode & IEEE_A) { 5631 if (priv->ieee->mode & IEEE_A) {
4433 network->mode = IEEE_A; 5632 network->mode = IEEE_A;
4434 priv->channel = band_a_active_channel[0]; 5633 priv->channel = geo->a[0].channel;
4435 } else if (priv->ieee->mode & IEEE_G) { 5634 } else if (priv->ieee->mode & IEEE_G) {
4436 network->mode = IEEE_G; 5635 network->mode = IEEE_G;
4437 priv->channel = band_b_active_channel[0]; 5636 priv->channel = geo->bg[0].channel;
4438 } else { 5637 } else {
4439 network->mode = IEEE_B; 5638 network->mode = IEEE_B;
4440 priv->channel = band_b_active_channel[0]; 5639 priv->channel = geo->bg[0].channel;
4441 } 5640 }
5641 break;
4442 } 5642 }
4443 5643
4444 network->channel = priv->channel; 5644 network->channel = priv->channel;
@@ -4448,6 +5648,8 @@ static void ipw_adhoc_create(struct ipw_priv *priv,
4448 memcpy(network->ssid, priv->essid, priv->essid_len); 5648 memcpy(network->ssid, priv->essid, priv->essid_len);
4449 memset(&network->stats, 0, sizeof(network->stats)); 5649 memset(&network->stats, 0, sizeof(network->stats));
4450 network->capability = WLAN_CAPABILITY_IBSS; 5650 network->capability = WLAN_CAPABILITY_IBSS;
5651 if (!(priv->config & CFG_PREAMBLE_LONG))
5652 network->capability |= WLAN_CAPABILITY_SHORT_PREAMBLE;
4451 if (priv->capability & CAP_PRIVACY_ON) 5653 if (priv->capability & CAP_PRIVACY_ON)
4452 network->capability |= WLAN_CAPABILITY_PRIVACY; 5654 network->capability |= WLAN_CAPABILITY_PRIVACY;
4453 network->rates_len = min(priv->rates.num_rates, MAX_RATES_LENGTH); 5655 network->rates_len = min(priv->rates.num_rates, MAX_RATES_LENGTH);
@@ -4464,13 +5666,35 @@ static void ipw_adhoc_create(struct ipw_priv *priv,
4464 network->beacon_interval = 100; /* Default */ 5666 network->beacon_interval = 100; /* Default */
4465 network->listen_interval = 10; /* Default */ 5667 network->listen_interval = 10; /* Default */
4466 network->atim_window = 0; /* Default */ 5668 network->atim_window = 0; /* Default */
4467#ifdef CONFIG_IEEE80211_WPA
4468 network->wpa_ie_len = 0; 5669 network->wpa_ie_len = 0;
4469 network->rsn_ie_len = 0; 5670 network->rsn_ie_len = 0;
4470#endif /* CONFIG_IEEE80211_WPA */
4471} 5671}
4472 5672
4473static void ipw_send_wep_keys(struct ipw_priv *priv) 5673static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index)
5674{
5675 struct ipw_tgi_tx_key *key;
5676 struct host_cmd cmd = {
5677 .cmd = IPW_CMD_TGI_TX_KEY,
5678 .len = sizeof(*key)
5679 };
5680
5681 if (!(priv->ieee->sec.flags & (1 << index)))
5682 return;
5683
5684 key = (struct ipw_tgi_tx_key *)&cmd.param;
5685 key->key_id = index;
5686 memcpy(key->key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH);
5687 key->security_type = type;
5688 key->station_index = 0; /* always 0 for BSS */
5689 key->flags = 0;
5690 /* 0 for new key; previous value of counter (after fatal error) */
5691 key->tx_counter[0] = 0;
5692 key->tx_counter[1] = 0;
5693
5694 ipw_send_cmd(priv, &cmd);
5695}
5696
5697static void ipw_send_wep_keys(struct ipw_priv *priv, int type)
4474{ 5698{
4475 struct ipw_wep_key *key; 5699 struct ipw_wep_key *key;
4476 int i; 5700 int i;
@@ -4483,19 +5707,97 @@ static void ipw_send_wep_keys(struct ipw_priv *priv)
4483 key->cmd_id = DINO_CMD_WEP_KEY; 5707 key->cmd_id = DINO_CMD_WEP_KEY;
4484 key->seq_num = 0; 5708 key->seq_num = 0;
4485 5709
5710 /* Note: AES keys cannot be set for multiple times.
5711 * Only set it at the first time. */
4486 for (i = 0; i < 4; i++) { 5712 for (i = 0; i < 4; i++) {
4487 key->key_index = i; 5713 key->key_index = i | type;
4488 if (!(priv->sec.flags & (1 << i))) { 5714 if (!(priv->ieee->sec.flags & (1 << i))) {
4489 key->key_size = 0; 5715 key->key_size = 0;
4490 } else { 5716 continue;
4491 key->key_size = priv->sec.key_sizes[i];
4492 memcpy(key->key, priv->sec.keys[i], key->key_size);
4493 } 5717 }
4494 5718
4495 if (ipw_send_cmd(priv, &cmd)) { 5719 key->key_size = priv->ieee->sec.key_sizes[i];
4496 IPW_ERROR("failed to send WEP_KEY command\n"); 5720 memcpy(key->key, priv->ieee->sec.keys[i], key->key_size);
4497 return; 5721
4498 } 5722 ipw_send_cmd(priv, &cmd);
5723 }
5724}
5725
5726static void ipw_set_hw_decrypt_unicast(struct ipw_priv *priv, int level)
5727{
5728 if (priv->ieee->host_encrypt)
5729 return;
5730
5731 switch (level) {
5732 case SEC_LEVEL_3:
5733 priv->sys_config.disable_unicast_decryption = 0;
5734 priv->ieee->host_decrypt = 0;
5735 break;
5736 case SEC_LEVEL_2:
5737 priv->sys_config.disable_unicast_decryption = 1;
5738 priv->ieee->host_decrypt = 1;
5739 break;
5740 case SEC_LEVEL_1:
5741 priv->sys_config.disable_unicast_decryption = 0;
5742 priv->ieee->host_decrypt = 0;
5743 break;
5744 case SEC_LEVEL_0:
5745 priv->sys_config.disable_unicast_decryption = 1;
5746 break;
5747 default:
5748 break;
5749 }
5750}
5751
5752static void ipw_set_hw_decrypt_multicast(struct ipw_priv *priv, int level)
5753{
5754 if (priv->ieee->host_encrypt)
5755 return;
5756
5757 switch (level) {
5758 case SEC_LEVEL_3:
5759 priv->sys_config.disable_multicast_decryption = 0;
5760 break;
5761 case SEC_LEVEL_2:
5762 priv->sys_config.disable_multicast_decryption = 1;
5763 break;
5764 case SEC_LEVEL_1:
5765 priv->sys_config.disable_multicast_decryption = 0;
5766 break;
5767 case SEC_LEVEL_0:
5768 priv->sys_config.disable_multicast_decryption = 1;
5769 break;
5770 default:
5771 break;
5772 }
5773}
5774
5775static void ipw_set_hwcrypto_keys(struct ipw_priv *priv)
5776{
5777 switch (priv->ieee->sec.level) {
5778 case SEC_LEVEL_3:
5779 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY)
5780 ipw_send_tgi_tx_key(priv,
5781 DCT_FLAG_EXT_SECURITY_CCM,
5782 priv->ieee->sec.active_key);
5783
5784 if (!priv->ieee->host_mc_decrypt)
5785 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_CCM);
5786 break;
5787 case SEC_LEVEL_2:
5788 if (priv->ieee->sec.flags & SEC_ACTIVE_KEY)
5789 ipw_send_tgi_tx_key(priv,
5790 DCT_FLAG_EXT_SECURITY_TKIP,
5791 priv->ieee->sec.active_key);
5792 break;
5793 case SEC_LEVEL_1:
5794 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP);
5795 ipw_set_hw_decrypt_unicast(priv, priv->ieee->sec.level);
5796 ipw_set_hw_decrypt_multicast(priv, priv->ieee->sec.level);
5797 break;
5798 case SEC_LEVEL_0:
5799 default:
5800 break;
4499 } 5801 }
4500} 5802}
4501 5803
@@ -4503,9 +5805,12 @@ static void ipw_adhoc_check(void *data)
4503{ 5805{
4504 struct ipw_priv *priv = data; 5806 struct ipw_priv *priv = data;
4505 5807
4506 if (priv->missed_adhoc_beacons++ > priv->missed_beacon_threshold && 5808 if (priv->missed_adhoc_beacons++ > priv->disassociate_threshold &&
4507 !(priv->config & CFG_ADHOC_PERSIST)) { 5809 !(priv->config & CFG_ADHOC_PERSIST)) {
4508 IPW_DEBUG_SCAN("Disassociating due to missed beacons\n"); 5810 IPW_DEBUG(IPW_DL_INFO | IPW_DL_NOTIF |
5811 IPW_DL_STATE | IPW_DL_ASSOC,
5812 "Missed beacon: %d - disassociate\n",
5813 priv->missed_adhoc_beacons);
4509 ipw_remove_current_network(priv); 5814 ipw_remove_current_network(priv);
4510 ipw_disassociate(priv); 5815 ipw_disassociate(priv);
4511 return; 5816 return;
@@ -4515,6 +5820,14 @@ static void ipw_adhoc_check(void *data)
4515 priv->assoc_request.beacon_interval); 5820 priv->assoc_request.beacon_interval);
4516} 5821}
4517 5822
5823static void ipw_bg_adhoc_check(void *data)
5824{
5825 struct ipw_priv *priv = data;
5826 down(&priv->sem);
5827 ipw_adhoc_check(data);
5828 up(&priv->sem);
5829}
5830
4518#ifdef CONFIG_IPW_DEBUG 5831#ifdef CONFIG_IPW_DEBUG
4519static void ipw_debug_config(struct ipw_priv *priv) 5832static void ipw_debug_config(struct ipw_priv *priv)
4520{ 5833{
@@ -4530,7 +5843,8 @@ static void ipw_debug_config(struct ipw_priv *priv)
4530 else 5843 else
4531 IPW_DEBUG_INFO("ESSID unlocked.\n"); 5844 IPW_DEBUG_INFO("ESSID unlocked.\n");
4532 if (priv->config & CFG_STATIC_BSSID) 5845 if (priv->config & CFG_STATIC_BSSID)
4533 IPW_DEBUG_INFO("BSSID locked to %d\n", priv->channel); 5846 IPW_DEBUG_INFO("BSSID locked to " MAC_FMT "\n",
5847 MAC_ARG(priv->bssid));
4534 else 5848 else
4535 IPW_DEBUG_INFO("BSSID unlocked.\n"); 5849 IPW_DEBUG_INFO("BSSID unlocked.\n");
4536 if (priv->capability & CAP_PRIVACY_ON) 5850 if (priv->capability & CAP_PRIVACY_ON)
@@ -4543,8 +5857,7 @@ static void ipw_debug_config(struct ipw_priv *priv)
4543#define ipw_debug_config(x) do {} while (0) 5857#define ipw_debug_config(x) do {} while (0)
4544#endif 5858#endif
4545 5859
4546static inline void ipw_set_fixed_rate(struct ipw_priv *priv, 5860static inline void ipw_set_fixed_rate(struct ipw_priv *priv, int mode)
4547 struct ieee80211_network *network)
4548{ 5861{
4549 /* TODO: Verify that this works... */ 5862 /* TODO: Verify that this works... */
4550 struct ipw_fixed_rate fr = { 5863 struct ipw_fixed_rate fr = {
@@ -4561,6 +5874,8 @@ static inline void ipw_set_fixed_rate(struct ipw_priv *priv,
4561 /* IEEE_A */ 5874 /* IEEE_A */
4562 if (priv->rates_mask & ~IEEE80211_OFDM_RATES_MASK) { 5875 if (priv->rates_mask & ~IEEE80211_OFDM_RATES_MASK) {
4563 /* Invalid fixed rate mask */ 5876 /* Invalid fixed rate mask */
5877 IPW_DEBUG_WX
5878 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
4564 fr.tx_rates = 0; 5879 fr.tx_rates = 0;
4565 break; 5880 break;
4566 } 5881 }
@@ -4570,9 +5885,11 @@ static inline void ipw_set_fixed_rate(struct ipw_priv *priv,
4570 5885
4571 default: /* 2.4Ghz or Mixed */ 5886 default: /* 2.4Ghz or Mixed */
4572 /* IEEE_B */ 5887 /* IEEE_B */
4573 if (network->mode == IEEE_B) { 5888 if (mode == IEEE_B) {
4574 if (fr.tx_rates & ~IEEE80211_CCK_RATES_MASK) { 5889 if (fr.tx_rates & ~IEEE80211_CCK_RATES_MASK) {
4575 /* Invalid fixed rate mask */ 5890 /* Invalid fixed rate mask */
5891 IPW_DEBUG_WX
5892 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
4576 fr.tx_rates = 0; 5893 fr.tx_rates = 0;
4577 } 5894 }
4578 break; 5895 break;
@@ -4582,6 +5899,8 @@ static inline void ipw_set_fixed_rate(struct ipw_priv *priv,
4582 if (fr.tx_rates & ~(IEEE80211_CCK_RATES_MASK | 5899 if (fr.tx_rates & ~(IEEE80211_CCK_RATES_MASK |
4583 IEEE80211_OFDM_RATES_MASK)) { 5900 IEEE80211_OFDM_RATES_MASK)) {
4584 /* Invalid fixed rate mask */ 5901 /* Invalid fixed rate mask */
5902 IPW_DEBUG_WX
5903 ("invalid fixed rate mask in ipw_set_fixed_rate\n");
4585 fr.tx_rates = 0; 5904 fr.tx_rates = 0;
4586 break; 5905 break;
4587 } 5906 }
@@ -4609,6 +5928,1112 @@ static inline void ipw_set_fixed_rate(struct ipw_priv *priv,
4609 ipw_write_reg32(priv, reg, *(u32 *) & fr); 5928 ipw_write_reg32(priv, reg, *(u32 *) & fr);
4610} 5929}
4611 5930
5931static void ipw_abort_scan(struct ipw_priv *priv)
5932{
5933 int err;
5934
5935 if (priv->status & STATUS_SCAN_ABORTING) {
5936 IPW_DEBUG_HC("Ignoring concurrent scan abort request.\n");
5937 return;
5938 }
5939 priv->status |= STATUS_SCAN_ABORTING;
5940
5941 err = ipw_send_scan_abort(priv);
5942 if (err)
5943 IPW_DEBUG_HC("Request to abort scan failed.\n");
5944}
5945
5946static void ipw_add_scan_channels(struct ipw_priv *priv,
5947 struct ipw_scan_request_ext *scan,
5948 int scan_type)
5949{
5950 int channel_index = 0;
5951 const struct ieee80211_geo *geo;
5952 int i;
5953
5954 geo = ipw_get_geo(priv->ieee);
5955
5956 if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) {
5957 int start = channel_index;
5958 for (i = 0; i < geo->a_channels; i++) {
5959 if ((priv->status & STATUS_ASSOCIATED) &&
5960 geo->a[i].channel == priv->channel)
5961 continue;
5962 channel_index++;
5963 scan->channels_list[channel_index] = geo->a[i].channel;
5964 ipw_set_scan_type(scan, channel_index,
5965 geo->a[i].
5966 flags & IEEE80211_CH_PASSIVE_ONLY ?
5967 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN :
5968 scan_type);
5969 }
5970
5971 if (start != channel_index) {
5972 scan->channels_list[start] = (u8) (IPW_A_MODE << 6) |
5973 (channel_index - start);
5974 channel_index++;
5975 }
5976 }
5977
5978 if (priv->ieee->freq_band & IEEE80211_24GHZ_BAND) {
5979 int start = channel_index;
5980 if (priv->config & CFG_SPEED_SCAN) {
5981 int index;
5982 u8 channels[IEEE80211_24GHZ_CHANNELS] = {
5983 /* nop out the list */
5984 [0] = 0
5985 };
5986
5987 u8 channel;
5988 while (channel_index < IPW_SCAN_CHANNELS) {
5989 channel =
5990 priv->speed_scan[priv->speed_scan_pos];
5991 if (channel == 0) {
5992 priv->speed_scan_pos = 0;
5993 channel = priv->speed_scan[0];
5994 }
5995 if ((priv->status & STATUS_ASSOCIATED) &&
5996 channel == priv->channel) {
5997 priv->speed_scan_pos++;
5998 continue;
5999 }
6000
6001 /* If this channel has already been
6002 * added in scan, break from loop
6003 * and this will be the first channel
6004 * in the next scan.
6005 */
6006 if (channels[channel - 1] != 0)
6007 break;
6008
6009 channels[channel - 1] = 1;
6010 priv->speed_scan_pos++;
6011 channel_index++;
6012 scan->channels_list[channel_index] = channel;
6013 index =
6014 ipw_channel_to_index(priv->ieee, channel);
6015 ipw_set_scan_type(scan, channel_index,
6016 geo->bg[index].
6017 flags &
6018 IEEE80211_CH_PASSIVE_ONLY ?
6019 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6020 : scan_type);
6021 }
6022 } else {
6023 for (i = 0; i < geo->bg_channels; i++) {
6024 if ((priv->status & STATUS_ASSOCIATED) &&
6025 geo->bg[i].channel == priv->channel)
6026 continue;
6027 channel_index++;
6028 scan->channels_list[channel_index] =
6029 geo->bg[i].channel;
6030 ipw_set_scan_type(scan, channel_index,
6031 geo->bg[i].
6032 flags &
6033 IEEE80211_CH_PASSIVE_ONLY ?
6034 IPW_SCAN_PASSIVE_FULL_DWELL_SCAN
6035 : scan_type);
6036 }
6037 }
6038
6039 if (start != channel_index) {
6040 scan->channels_list[start] = (u8) (IPW_B_MODE << 6) |
6041 (channel_index - start);
6042 }
6043 }
6044}
6045
6046static int ipw_request_scan(struct ipw_priv *priv)
6047{
6048 struct ipw_scan_request_ext scan;
6049 int err = 0, scan_type;
6050
6051 if (!(priv->status & STATUS_INIT) ||
6052 (priv->status & STATUS_EXIT_PENDING))
6053 return 0;
6054
6055 down(&priv->sem);
6056
6057 if (priv->status & STATUS_SCANNING) {
6058 IPW_DEBUG_HC("Concurrent scan requested. Ignoring.\n");
6059 priv->status |= STATUS_SCAN_PENDING;
6060 goto done;
6061 }
6062
6063 if (!(priv->status & STATUS_SCAN_FORCED) &&
6064 priv->status & STATUS_SCAN_ABORTING) {
6065 IPW_DEBUG_HC("Scan request while abort pending. Queuing.\n");
6066 priv->status |= STATUS_SCAN_PENDING;
6067 goto done;
6068 }
6069
6070 if (priv->status & STATUS_RF_KILL_MASK) {
6071 IPW_DEBUG_HC("Aborting scan due to RF Kill activation\n");
6072 priv->status |= STATUS_SCAN_PENDING;
6073 goto done;
6074 }
6075
6076 memset(&scan, 0, sizeof(scan));
6077
6078 if (priv->config & CFG_SPEED_SCAN)
6079 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
6080 cpu_to_le16(30);
6081 else
6082 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
6083 cpu_to_le16(20);
6084
6085 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
6086 cpu_to_le16(20);
6087 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
6088
6089 scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
6090
6091#ifdef CONFIG_IPW2200_MONITOR
6092 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
6093 u8 channel;
6094 u8 band = 0;
6095
6096 switch (ipw_is_valid_channel(priv->ieee, priv->channel)) {
6097 case IEEE80211_52GHZ_BAND:
6098 band = (u8) (IPW_A_MODE << 6) | 1;
6099 channel = priv->channel;
6100 break;
6101
6102 case IEEE80211_24GHZ_BAND:
6103 band = (u8) (IPW_B_MODE << 6) | 1;
6104 channel = priv->channel;
6105 break;
6106
6107 default:
6108 band = (u8) (IPW_B_MODE << 6) | 1;
6109 channel = 9;
6110 break;
6111 }
6112
6113 scan.channels_list[0] = band;
6114 scan.channels_list[1] = channel;
6115 ipw_set_scan_type(&scan, 1, IPW_SCAN_PASSIVE_FULL_DWELL_SCAN);
6116
6117 /* NOTE: The card will sit on this channel for this time
6118 * period. Scan aborts are timing sensitive and frequently
6119 * result in firmware restarts. As such, it is best to
6120 * set a small dwell_time here and just keep re-issuing
6121 * scans. Otherwise fast channel hopping will not actually
6122 * hop channels.
6123 *
6124 * TODO: Move SPEED SCAN support to all modes and bands */
6125 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
6126 cpu_to_le16(2000);
6127 } else {
6128#endif /* CONFIG_IPW2200_MONITOR */
6129 /* If we are roaming, then make this a directed scan for the
6130 * current network. Otherwise, ensure that every other scan
6131 * is a fast channel hop scan */
6132 if ((priv->status & STATUS_ROAMING)
6133 || (!(priv->status & STATUS_ASSOCIATED)
6134 && (priv->config & CFG_STATIC_ESSID)
6135 && (le32_to_cpu(scan.full_scan_index) % 2))) {
6136 err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
6137 if (err) {
6138 IPW_DEBUG_HC("Attempt to send SSID command "
6139 "failed.\n");
6140 goto done;
6141 }
6142
6143 scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN;
6144 } else
6145 scan_type = IPW_SCAN_ACTIVE_BROADCAST_SCAN;
6146
6147 ipw_add_scan_channels(priv, &scan, scan_type);
6148#ifdef CONFIG_IPW2200_MONITOR
6149 }
6150#endif
6151
6152 err = ipw_send_scan_request_ext(priv, &scan);
6153 if (err) {
6154 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
6155 goto done;
6156 }
6157
6158 priv->status |= STATUS_SCANNING;
6159 priv->status &= ~STATUS_SCAN_PENDING;
6160 queue_delayed_work(priv->workqueue, &priv->scan_check,
6161 IPW_SCAN_CHECK_WATCHDOG);
6162 done:
6163 up(&priv->sem);
6164 return err;
6165}
6166
6167static void ipw_bg_abort_scan(void *data)
6168{
6169 struct ipw_priv *priv = data;
6170 down(&priv->sem);
6171 ipw_abort_scan(data);
6172 up(&priv->sem);
6173}
6174
6175static int ipw_wpa_enable(struct ipw_priv *priv, int value)
6176{
6177 /* This is called when wpa_supplicant loads and closes the driver
6178 * interface. */
6179 priv->ieee->wpa_enabled = value;
6180 return 0;
6181}
6182
6183static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value)
6184{
6185 struct ieee80211_device *ieee = priv->ieee;
6186 struct ieee80211_security sec = {
6187 .flags = SEC_AUTH_MODE,
6188 };
6189 int ret = 0;
6190
6191 if (value & IW_AUTH_ALG_SHARED_KEY) {
6192 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
6193 ieee->open_wep = 0;
6194 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
6195 sec.auth_mode = WLAN_AUTH_OPEN;
6196 ieee->open_wep = 1;
6197 } else
6198 return -EINVAL;
6199
6200 if (ieee->set_security)
6201 ieee->set_security(ieee->dev, &sec);
6202 else
6203 ret = -EOPNOTSUPP;
6204
6205 return ret;
6206}
6207
6208void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, int wpa_ie_len)
6209{
6210 /* make sure WPA is enabled */
6211 ipw_wpa_enable(priv, 1);
6212
6213 ipw_disassociate(priv);
6214}
6215
6216static int ipw_set_rsn_capa(struct ipw_priv *priv,
6217 char *capabilities, int length)
6218{
6219 struct host_cmd cmd = {
6220 .cmd = IPW_CMD_RSN_CAPABILITIES,
6221 .len = length,
6222 };
6223
6224 IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n");
6225
6226 memcpy(cmd.param, capabilities, length);
6227 return ipw_send_cmd(priv, &cmd);
6228}
6229
6230/*
6231 * WE-18 support
6232 */
6233
6234/* SIOCSIWGENIE */
6235static int ipw_wx_set_genie(struct net_device *dev,
6236 struct iw_request_info *info,
6237 union iwreq_data *wrqu, char *extra)
6238{
6239 struct ipw_priv *priv = ieee80211_priv(dev);
6240 struct ieee80211_device *ieee = priv->ieee;
6241 u8 *buf;
6242 int err = 0;
6243
6244 if (wrqu->data.length > MAX_WPA_IE_LEN ||
6245 (wrqu->data.length && extra == NULL))
6246 return -EINVAL;
6247
6248 //down(&priv->sem);
6249
6250 //if (!ieee->wpa_enabled) {
6251 // err = -EOPNOTSUPP;
6252 // goto out;
6253 //}
6254
6255 if (wrqu->data.length) {
6256 buf = kmalloc(wrqu->data.length, GFP_KERNEL);
6257 if (buf == NULL) {
6258 err = -ENOMEM;
6259 goto out;
6260 }
6261
6262 memcpy(buf, extra, wrqu->data.length);
6263 kfree(ieee->wpa_ie);
6264 ieee->wpa_ie = buf;
6265 ieee->wpa_ie_len = wrqu->data.length;
6266 } else {
6267 kfree(ieee->wpa_ie);
6268 ieee->wpa_ie = NULL;
6269 ieee->wpa_ie_len = 0;
6270 }
6271
6272 ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
6273 out:
6274 //up(&priv->sem);
6275 return err;
6276}
6277
6278/* SIOCGIWGENIE */
6279static int ipw_wx_get_genie(struct net_device *dev,
6280 struct iw_request_info *info,
6281 union iwreq_data *wrqu, char *extra)
6282{
6283 struct ipw_priv *priv = ieee80211_priv(dev);
6284 struct ieee80211_device *ieee = priv->ieee;
6285 int err = 0;
6286
6287 //down(&priv->sem);
6288
6289 //if (!ieee->wpa_enabled) {
6290 // err = -EOPNOTSUPP;
6291 // goto out;
6292 //}
6293
6294 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
6295 wrqu->data.length = 0;
6296 goto out;
6297 }
6298
6299 if (wrqu->data.length < ieee->wpa_ie_len) {
6300 err = -E2BIG;
6301 goto out;
6302 }
6303
6304 wrqu->data.length = ieee->wpa_ie_len;
6305 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
6306
6307 out:
6308 //up(&priv->sem);
6309 return err;
6310}
6311
6312static int wext_cipher2level(int cipher)
6313{
6314 switch (cipher) {
6315 case IW_AUTH_CIPHER_NONE:
6316 return SEC_LEVEL_0;
6317 case IW_AUTH_CIPHER_WEP40:
6318 case IW_AUTH_CIPHER_WEP104:
6319 return SEC_LEVEL_1;
6320 case IW_AUTH_CIPHER_TKIP:
6321 return SEC_LEVEL_2;
6322 case IW_AUTH_CIPHER_CCMP:
6323 return SEC_LEVEL_3;
6324 default:
6325 return -1;
6326 }
6327}
6328
6329/* SIOCSIWAUTH */
6330static int ipw_wx_set_auth(struct net_device *dev,
6331 struct iw_request_info *info,
6332 union iwreq_data *wrqu, char *extra)
6333{
6334 struct ipw_priv *priv = ieee80211_priv(dev);
6335 struct ieee80211_device *ieee = priv->ieee;
6336 struct iw_param *param = &wrqu->param;
6337 struct ieee80211_crypt_data *crypt;
6338 unsigned long flags;
6339 int ret = 0;
6340
6341 switch (param->flags & IW_AUTH_INDEX) {
6342 case IW_AUTH_WPA_VERSION:
6343 break;
6344 case IW_AUTH_CIPHER_PAIRWISE:
6345 ipw_set_hw_decrypt_unicast(priv,
6346 wext_cipher2level(param->value));
6347 break;
6348 case IW_AUTH_CIPHER_GROUP:
6349 ipw_set_hw_decrypt_multicast(priv,
6350 wext_cipher2level(param->value));
6351 break;
6352 case IW_AUTH_KEY_MGMT:
6353 /*
6354 * ipw2200 does not use these parameters
6355 */
6356 break;
6357
6358 case IW_AUTH_TKIP_COUNTERMEASURES:
6359 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6360 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
6361 break;
6362
6363 flags = crypt->ops->get_flags(crypt->priv);
6364
6365 if (param->value)
6366 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6367 else
6368 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
6369
6370 crypt->ops->set_flags(flags, crypt->priv);
6371
6372 break;
6373
6374 case IW_AUTH_DROP_UNENCRYPTED:{
6375 /* HACK:
6376 *
6377 * wpa_supplicant calls set_wpa_enabled when the driver
6378 * is loaded and unloaded, regardless of if WPA is being
6379 * used. No other calls are made which can be used to
6380 * determine if encryption will be used or not prior to
6381 * association being expected. If encryption is not being
6382 * used, drop_unencrypted is set to false, else true -- we
6383 * can use this to determine if the CAP_PRIVACY_ON bit should
6384 * be set.
6385 */
6386 struct ieee80211_security sec = {
6387 .flags = SEC_ENABLED,
6388 .enabled = param->value,
6389 };
6390 priv->ieee->drop_unencrypted = param->value;
6391 /* We only change SEC_LEVEL for open mode. Others
6392 * are set by ipw_wpa_set_encryption.
6393 */
6394 if (!param->value) {
6395 sec.flags |= SEC_LEVEL;
6396 sec.level = SEC_LEVEL_0;
6397 } else {
6398 sec.flags |= SEC_LEVEL;
6399 sec.level = SEC_LEVEL_1;
6400 }
6401 if (priv->ieee->set_security)
6402 priv->ieee->set_security(priv->ieee->dev, &sec);
6403 break;
6404 }
6405
6406 case IW_AUTH_80211_AUTH_ALG:
6407 ret = ipw_wpa_set_auth_algs(priv, param->value);
6408 break;
6409
6410 case IW_AUTH_WPA_ENABLED:
6411 ret = ipw_wpa_enable(priv, param->value);
6412 break;
6413
6414 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6415 ieee->ieee802_1x = param->value;
6416 break;
6417
6418 //case IW_AUTH_ROAMING_CONTROL:
6419 case IW_AUTH_PRIVACY_INVOKED:
6420 ieee->privacy_invoked = param->value;
6421 break;
6422
6423 default:
6424 return -EOPNOTSUPP;
6425 }
6426 return ret;
6427}
6428
6429/* SIOCGIWAUTH */
6430static int ipw_wx_get_auth(struct net_device *dev,
6431 struct iw_request_info *info,
6432 union iwreq_data *wrqu, char *extra)
6433{
6434 struct ipw_priv *priv = ieee80211_priv(dev);
6435 struct ieee80211_device *ieee = priv->ieee;
6436 struct ieee80211_crypt_data *crypt;
6437 struct iw_param *param = &wrqu->param;
6438 int ret = 0;
6439
6440 switch (param->flags & IW_AUTH_INDEX) {
6441 case IW_AUTH_WPA_VERSION:
6442 case IW_AUTH_CIPHER_PAIRWISE:
6443 case IW_AUTH_CIPHER_GROUP:
6444 case IW_AUTH_KEY_MGMT:
6445 /*
6446 * wpa_supplicant will control these internally
6447 */
6448 ret = -EOPNOTSUPP;
6449 break;
6450
6451 case IW_AUTH_TKIP_COUNTERMEASURES:
6452 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
6453 if (!crypt || !crypt->ops->get_flags)
6454 break;
6455
6456 param->value = (crypt->ops->get_flags(crypt->priv) &
6457 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
6458
6459 break;
6460
6461 case IW_AUTH_DROP_UNENCRYPTED:
6462 param->value = ieee->drop_unencrypted;
6463 break;
6464
6465 case IW_AUTH_80211_AUTH_ALG:
6466 param->value = ieee->sec.auth_mode;
6467 break;
6468
6469 case IW_AUTH_WPA_ENABLED:
6470 param->value = ieee->wpa_enabled;
6471 break;
6472
6473 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6474 param->value = ieee->ieee802_1x;
6475 break;
6476
6477 case IW_AUTH_ROAMING_CONTROL:
6478 case IW_AUTH_PRIVACY_INVOKED:
6479 param->value = ieee->privacy_invoked;
6480 break;
6481
6482 default:
6483 return -EOPNOTSUPP;
6484 }
6485 return 0;
6486}
6487
6488/* SIOCSIWENCODEEXT */
6489static int ipw_wx_set_encodeext(struct net_device *dev,
6490 struct iw_request_info *info,
6491 union iwreq_data *wrqu, char *extra)
6492{
6493 struct ipw_priv *priv = ieee80211_priv(dev);
6494 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6495
6496 if (hwcrypto) {
6497 if (ext->alg == IW_ENCODE_ALG_TKIP) {
6498 /* IPW HW can't build TKIP MIC,
6499 host decryption still needed */
6500 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
6501 priv->ieee->host_mc_decrypt = 1;
6502 else {
6503 priv->ieee->host_encrypt = 0;
6504 priv->ieee->host_encrypt_msdu = 1;
6505 priv->ieee->host_decrypt = 1;
6506 }
6507 } else {
6508 priv->ieee->host_encrypt = 0;
6509 priv->ieee->host_encrypt_msdu = 0;
6510 priv->ieee->host_decrypt = 0;
6511 priv->ieee->host_mc_decrypt = 0;
6512 }
6513 }
6514
6515 return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
6516}
6517
6518/* SIOCGIWENCODEEXT */
6519static int ipw_wx_get_encodeext(struct net_device *dev,
6520 struct iw_request_info *info,
6521 union iwreq_data *wrqu, char *extra)
6522{
6523 struct ipw_priv *priv = ieee80211_priv(dev);
6524 return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
6525}
6526
6527/* SIOCSIWMLME */
6528static int ipw_wx_set_mlme(struct net_device *dev,
6529 struct iw_request_info *info,
6530 union iwreq_data *wrqu, char *extra)
6531{
6532 struct ipw_priv *priv = ieee80211_priv(dev);
6533 struct iw_mlme *mlme = (struct iw_mlme *)extra;
6534 u16 reason;
6535
6536 reason = cpu_to_le16(mlme->reason_code);
6537
6538 switch (mlme->cmd) {
6539 case IW_MLME_DEAUTH:
6540 // silently ignore
6541 break;
6542
6543 case IW_MLME_DISASSOC:
6544 ipw_disassociate(priv);
6545 break;
6546
6547 default:
6548 return -EOPNOTSUPP;
6549 }
6550 return 0;
6551}
6552
6553#ifdef CONFIG_IPW_QOS
6554
6555/* QoS */
6556/*
6557* get the modulation type of the current network or
6558* the card current mode
6559*/
6560u8 ipw_qos_current_mode(struct ipw_priv * priv)
6561{
6562 u8 mode = 0;
6563
6564 if (priv->status & STATUS_ASSOCIATED) {
6565 unsigned long flags;
6566
6567 spin_lock_irqsave(&priv->ieee->lock, flags);
6568 mode = priv->assoc_network->mode;
6569 spin_unlock_irqrestore(&priv->ieee->lock, flags);
6570 } else {
6571 mode = priv->ieee->mode;
6572 }
6573 IPW_DEBUG_QOS("QoS network/card mode %d \n", mode);
6574 return mode;
6575}
6576
6577/*
6578* Handle management frame beacon and probe response
6579*/
6580static int ipw_qos_handle_probe_response(struct ipw_priv *priv,
6581 int active_network,
6582 struct ieee80211_network *network)
6583{
6584 u32 size = sizeof(struct ieee80211_qos_parameters);
6585
6586 if (network->capability & WLAN_CAPABILITY_IBSS)
6587 network->qos_data.active = network->qos_data.supported;
6588
6589 if (network->flags & NETWORK_HAS_QOS_MASK) {
6590 if (active_network &&
6591 (network->flags & NETWORK_HAS_QOS_PARAMETERS))
6592 network->qos_data.active = network->qos_data.supported;
6593
6594 if ((network->qos_data.active == 1) && (active_network == 1) &&
6595 (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
6596 (network->qos_data.old_param_count !=
6597 network->qos_data.param_count)) {
6598 network->qos_data.old_param_count =
6599 network->qos_data.param_count;
6600 schedule_work(&priv->qos_activate);
6601 IPW_DEBUG_QOS("QoS parameters change call "
6602 "qos_activate\n");
6603 }
6604 } else {
6605 if ((priv->ieee->mode == IEEE_B) || (network->mode == IEEE_B))
6606 memcpy(&network->qos_data.parameters,
6607 &def_parameters_CCK, size);
6608 else
6609 memcpy(&network->qos_data.parameters,
6610 &def_parameters_OFDM, size);
6611
6612 if ((network->qos_data.active == 1) && (active_network == 1)) {
6613 IPW_DEBUG_QOS("QoS was disabled call qos_activate \n");
6614 schedule_work(&priv->qos_activate);
6615 }
6616
6617 network->qos_data.active = 0;
6618 network->qos_data.supported = 0;
6619 }
6620 if ((priv->status & STATUS_ASSOCIATED) &&
6621 (priv->ieee->iw_mode == IW_MODE_ADHOC) && (active_network == 0)) {
6622 if (memcmp(network->bssid, priv->bssid, ETH_ALEN))
6623 if ((network->capability & WLAN_CAPABILITY_IBSS) &&
6624 !(network->flags & NETWORK_EMPTY_ESSID))
6625 if ((network->ssid_len ==
6626 priv->assoc_network->ssid_len) &&
6627 !memcmp(network->ssid,
6628 priv->assoc_network->ssid,
6629 network->ssid_len)) {
6630 queue_work(priv->workqueue,
6631 &priv->merge_networks);
6632 }
6633 }
6634
6635 return 0;
6636}
6637
6638/*
6639* This function set up the firmware to support QoS. It sends
6640* IPW_CMD_QOS_PARAMETERS and IPW_CMD_WME_INFO
6641*/
6642static int ipw_qos_activate(struct ipw_priv *priv,
6643 struct ieee80211_qos_data *qos_network_data)
6644{
6645 int err;
6646 struct ieee80211_qos_parameters qos_parameters[QOS_QOS_SETS];
6647 struct ieee80211_qos_parameters *active_one = NULL;
6648 u32 size = sizeof(struct ieee80211_qos_parameters);
6649 u32 burst_duration;
6650 int i;
6651 u8 type;
6652
6653 type = ipw_qos_current_mode(priv);
6654
6655 active_one = &(qos_parameters[QOS_PARAM_SET_DEF_CCK]);
6656 memcpy(active_one, priv->qos_data.def_qos_parm_CCK, size);
6657 active_one = &(qos_parameters[QOS_PARAM_SET_DEF_OFDM]);
6658 memcpy(active_one, priv->qos_data.def_qos_parm_OFDM, size);
6659
6660 if (qos_network_data == NULL) {
6661 if (type == IEEE_B) {
6662 IPW_DEBUG_QOS("QoS activate network mode %d\n", type);
6663 active_one = &def_parameters_CCK;
6664 } else
6665 active_one = &def_parameters_OFDM;
6666
6667 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
6668 burst_duration = ipw_qos_get_burst_duration(priv);
6669 for (i = 0; i < QOS_QUEUE_NUM; i++)
6670 qos_parameters[QOS_PARAM_SET_ACTIVE].tx_op_limit[i] =
6671 (u16) burst_duration;
6672 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6673 if (type == IEEE_B) {
6674 IPW_DEBUG_QOS("QoS activate IBSS nework mode %d\n",
6675 type);
6676 if (priv->qos_data.qos_enable == 0)
6677 active_one = &def_parameters_CCK;
6678 else
6679 active_one = priv->qos_data.def_qos_parm_CCK;
6680 } else {
6681 if (priv->qos_data.qos_enable == 0)
6682 active_one = &def_parameters_OFDM;
6683 else
6684 active_one = priv->qos_data.def_qos_parm_OFDM;
6685 }
6686 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
6687 } else {
6688 unsigned long flags;
6689 int active;
6690
6691 spin_lock_irqsave(&priv->ieee->lock, flags);
6692 active_one = &(qos_network_data->parameters);
6693 qos_network_data->old_param_count =
6694 qos_network_data->param_count;
6695 memcpy(&qos_parameters[QOS_PARAM_SET_ACTIVE], active_one, size);
6696 active = qos_network_data->supported;
6697 spin_unlock_irqrestore(&priv->ieee->lock, flags);
6698
6699 if (active == 0) {
6700 burst_duration = ipw_qos_get_burst_duration(priv);
6701 for (i = 0; i < QOS_QUEUE_NUM; i++)
6702 qos_parameters[QOS_PARAM_SET_ACTIVE].
6703 tx_op_limit[i] = (u16) burst_duration;
6704 }
6705 }
6706
6707 IPW_DEBUG_QOS("QoS sending IPW_CMD_QOS_PARAMETERS\n");
6708 err = ipw_send_qos_params_command(priv,
6709 (struct ieee80211_qos_parameters *)
6710 &(qos_parameters[0]));
6711 if (err)
6712 IPW_DEBUG_QOS("QoS IPW_CMD_QOS_PARAMETERS failed\n");
6713
6714 return err;
6715}
6716
6717/*
6718* send IPW_CMD_WME_INFO to the firmware
6719*/
6720static int ipw_qos_set_info_element(struct ipw_priv *priv)
6721{
6722 int ret = 0;
6723 struct ieee80211_qos_information_element qos_info;
6724
6725 if (priv == NULL)
6726 return -1;
6727
6728 qos_info.elementID = QOS_ELEMENT_ID;
6729 qos_info.length = sizeof(struct ieee80211_qos_information_element) - 2;
6730
6731 qos_info.version = QOS_VERSION_1;
6732 qos_info.ac_info = 0;
6733
6734 memcpy(qos_info.qui, qos_oui, QOS_OUI_LEN);
6735 qos_info.qui_type = QOS_OUI_TYPE;
6736 qos_info.qui_subtype = QOS_OUI_INFO_SUB_TYPE;
6737
6738 ret = ipw_send_qos_info_command(priv, &qos_info);
6739 if (ret != 0) {
6740 IPW_DEBUG_QOS("QoS error calling ipw_send_qos_info_command\n");
6741 }
6742 return ret;
6743}
6744
6745/*
6746* Set the QoS parameter with the association request structure
6747*/
6748static int ipw_qos_association(struct ipw_priv *priv,
6749 struct ieee80211_network *network)
6750{
6751 int err = 0;
6752 struct ieee80211_qos_data *qos_data = NULL;
6753 struct ieee80211_qos_data ibss_data = {
6754 .supported = 1,
6755 .active = 1,
6756 };
6757
6758 switch (priv->ieee->iw_mode) {
6759 case IW_MODE_ADHOC:
6760 if (!(network->capability & WLAN_CAPABILITY_IBSS))
6761 BUG();
6762
6763 qos_data = &ibss_data;
6764 break;
6765
6766 case IW_MODE_INFRA:
6767 qos_data = &network->qos_data;
6768 break;
6769
6770 default:
6771 BUG();
6772 break;
6773 }
6774
6775 err = ipw_qos_activate(priv, qos_data);
6776 if (err) {
6777 priv->assoc_request.policy_support &= ~HC_QOS_SUPPORT_ASSOC;
6778 return err;
6779 }
6780
6781 if (priv->qos_data.qos_enable && qos_data->supported) {
6782 IPW_DEBUG_QOS("QoS will be enabled for this association\n");
6783 priv->assoc_request.policy_support |= HC_QOS_SUPPORT_ASSOC;
6784 return ipw_qos_set_info_element(priv);
6785 }
6786
6787 return 0;
6788}
6789
6790/*
6791* handling the beaconing responces. if we get different QoS setting
6792* of the network from the the associated setting adjust the QoS
6793* setting
6794*/
6795static int ipw_qos_association_resp(struct ipw_priv *priv,
6796 struct ieee80211_network *network)
6797{
6798 int ret = 0;
6799 unsigned long flags;
6800 u32 size = sizeof(struct ieee80211_qos_parameters);
6801 int set_qos_param = 0;
6802
6803 if ((priv == NULL) || (network == NULL) ||
6804 (priv->assoc_network == NULL))
6805 return ret;
6806
6807 if (!(priv->status & STATUS_ASSOCIATED))
6808 return ret;
6809
6810 if ((priv->ieee->iw_mode != IW_MODE_INFRA))
6811 return ret;
6812
6813 spin_lock_irqsave(&priv->ieee->lock, flags);
6814 if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
6815 memcpy(&priv->assoc_network->qos_data, &network->qos_data,
6816 sizeof(struct ieee80211_qos_data));
6817 priv->assoc_network->qos_data.active = 1;
6818 if ((network->qos_data.old_param_count !=
6819 network->qos_data.param_count)) {
6820 set_qos_param = 1;
6821 network->qos_data.old_param_count =
6822 network->qos_data.param_count;
6823 }
6824
6825 } else {
6826 if ((network->mode == IEEE_B) || (priv->ieee->mode == IEEE_B))
6827 memcpy(&priv->assoc_network->qos_data.parameters,
6828 &def_parameters_CCK, size);
6829 else
6830 memcpy(&priv->assoc_network->qos_data.parameters,
6831 &def_parameters_OFDM, size);
6832 priv->assoc_network->qos_data.active = 0;
6833 priv->assoc_network->qos_data.supported = 0;
6834 set_qos_param = 1;
6835 }
6836
6837 spin_unlock_irqrestore(&priv->ieee->lock, flags);
6838
6839 if (set_qos_param == 1)
6840 schedule_work(&priv->qos_activate);
6841
6842 return ret;
6843}
6844
6845static u32 ipw_qos_get_burst_duration(struct ipw_priv *priv)
6846{
6847 u32 ret = 0;
6848
6849 if ((priv == NULL))
6850 return 0;
6851
6852 if (!(priv->ieee->modulation & IEEE80211_OFDM_MODULATION))
6853 ret = priv->qos_data.burst_duration_CCK;
6854 else
6855 ret = priv->qos_data.burst_duration_OFDM;
6856
6857 return ret;
6858}
6859
6860/*
6861* Initialize the setting of QoS global
6862*/
6863static void ipw_qos_init(struct ipw_priv *priv, int enable,
6864 int burst_enable, u32 burst_duration_CCK,
6865 u32 burst_duration_OFDM)
6866{
6867 priv->qos_data.qos_enable = enable;
6868
6869 if (priv->qos_data.qos_enable) {
6870 priv->qos_data.def_qos_parm_CCK = &def_qos_parameters_CCK;
6871 priv->qos_data.def_qos_parm_OFDM = &def_qos_parameters_OFDM;
6872 IPW_DEBUG_QOS("QoS is enabled\n");
6873 } else {
6874 priv->qos_data.def_qos_parm_CCK = &def_parameters_CCK;
6875 priv->qos_data.def_qos_parm_OFDM = &def_parameters_OFDM;
6876 IPW_DEBUG_QOS("QoS is not enabled\n");
6877 }
6878
6879 priv->qos_data.burst_enable = burst_enable;
6880
6881 if (burst_enable) {
6882 priv->qos_data.burst_duration_CCK = burst_duration_CCK;
6883 priv->qos_data.burst_duration_OFDM = burst_duration_OFDM;
6884 } else {
6885 priv->qos_data.burst_duration_CCK = 0;
6886 priv->qos_data.burst_duration_OFDM = 0;
6887 }
6888}
6889
6890/*
6891* map the packet priority to the right TX Queue
6892*/
6893static int ipw_get_tx_queue_number(struct ipw_priv *priv, u16 priority)
6894{
6895 if (priority > 7 || !priv->qos_data.qos_enable)
6896 priority = 0;
6897
6898 return from_priority_to_tx_queue[priority] - 1;
6899}
6900
6901/*
6902* add QoS parameter to the TX command
6903*/
6904static int ipw_qos_set_tx_queue_command(struct ipw_priv *priv,
6905 u16 priority,
6906 struct tfd_data *tfd, u8 unicast)
6907{
6908 int ret = 0;
6909 int tx_queue_id = 0;
6910 struct ieee80211_qos_data *qos_data = NULL;
6911 int active, supported;
6912 unsigned long flags;
6913
6914 if (!(priv->status & STATUS_ASSOCIATED))
6915 return 0;
6916
6917 qos_data = &priv->assoc_network->qos_data;
6918
6919 spin_lock_irqsave(&priv->ieee->lock, flags);
6920
6921 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6922 if (unicast == 0)
6923 qos_data->active = 0;
6924 else
6925 qos_data->active = qos_data->supported;
6926 }
6927
6928 active = qos_data->active;
6929 supported = qos_data->supported;
6930
6931 spin_unlock_irqrestore(&priv->ieee->lock, flags);
6932
6933 IPW_DEBUG_QOS("QoS %d network is QoS active %d supported %d "
6934 "unicast %d\n",
6935 priv->qos_data.qos_enable, active, supported, unicast);
6936 if (active && priv->qos_data.qos_enable) {
6937 ret = from_priority_to_tx_queue[priority];
6938 tx_queue_id = ret - 1;
6939 IPW_DEBUG_QOS("QoS packet priority is %d \n", priority);
6940 if (priority <= 7) {
6941 tfd->tx_flags_ext |= DCT_FLAG_EXT_QOS_ENABLED;
6942 tfd->tfd.tfd_26.mchdr.qos_ctrl = priority;
6943 tfd->tfd.tfd_26.mchdr.frame_ctl |=
6944 IEEE80211_STYPE_QOS_DATA;
6945
6946 if (priv->qos_data.qos_no_ack_mask &
6947 (1UL << tx_queue_id)) {
6948 tfd->tx_flags &= ~DCT_FLAG_ACK_REQD;
6949 tfd->tfd.tfd_26.mchdr.qos_ctrl |=
6950 CTRL_QOS_NO_ACK;
6951 }
6952 }
6953 }
6954
6955 return ret;
6956}
6957
6958/*
6959* background support to run QoS activate functionality
6960*/
6961static void ipw_bg_qos_activate(void *data)
6962{
6963 struct ipw_priv *priv = data;
6964
6965 if (priv == NULL)
6966 return;
6967
6968 down(&priv->sem);
6969
6970 if (priv->status & STATUS_ASSOCIATED)
6971 ipw_qos_activate(priv, &(priv->assoc_network->qos_data));
6972
6973 up(&priv->sem);
6974}
6975
6976static int ipw_handle_probe_response(struct net_device *dev,
6977 struct ieee80211_probe_response *resp,
6978 struct ieee80211_network *network)
6979{
6980 struct ipw_priv *priv = ieee80211_priv(dev);
6981 int active_network = ((priv->status & STATUS_ASSOCIATED) &&
6982 (network == priv->assoc_network));
6983
6984 ipw_qos_handle_probe_response(priv, active_network, network);
6985
6986 return 0;
6987}
6988
6989static int ipw_handle_beacon(struct net_device *dev,
6990 struct ieee80211_beacon *resp,
6991 struct ieee80211_network *network)
6992{
6993 struct ipw_priv *priv = ieee80211_priv(dev);
6994 int active_network = ((priv->status & STATUS_ASSOCIATED) &&
6995 (network == priv->assoc_network));
6996
6997 ipw_qos_handle_probe_response(priv, active_network, network);
6998
6999 return 0;
7000}
7001
7002static int ipw_handle_assoc_response(struct net_device *dev,
7003 struct ieee80211_assoc_response *resp,
7004 struct ieee80211_network *network)
7005{
7006 struct ipw_priv *priv = ieee80211_priv(dev);
7007 ipw_qos_association_resp(priv, network);
7008 return 0;
7009}
7010
7011static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters
7012 *qos_param)
7013{
7014 struct host_cmd cmd = {
7015 .cmd = IPW_CMD_QOS_PARAMETERS,
7016 .len = (sizeof(struct ieee80211_qos_parameters) * 3)
7017 };
7018
7019 memcpy(cmd.param, qos_param, sizeof(*qos_param) * 3);
7020 return ipw_send_cmd(priv, &cmd);
7021}
7022
7023static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element
7024 *qos_param)
7025{
7026 struct host_cmd cmd = {
7027 .cmd = IPW_CMD_WME_INFO,
7028 .len = sizeof(*qos_param)
7029 };
7030
7031 memcpy(cmd.param, qos_param, sizeof(*qos_param));
7032 return ipw_send_cmd(priv, &cmd);
7033}
7034
7035#endif /* CONFIG_IPW_QOS */
7036
4612static int ipw_associate_network(struct ipw_priv *priv, 7037static int ipw_associate_network(struct ipw_priv *priv,
4613 struct ieee80211_network *network, 7038 struct ieee80211_network *network,
4614 struct ipw_supported_rates *rates, int roaming) 7039 struct ipw_supported_rates *rates, int roaming)
@@ -4616,7 +7041,7 @@ static int ipw_associate_network(struct ipw_priv *priv,
4616 int err; 7041 int err;
4617 7042
4618 if (priv->config & CFG_FIXED_RATE) 7043 if (priv->config & CFG_FIXED_RATE)
4619 ipw_set_fixed_rate(priv, network); 7044 ipw_set_fixed_rate(priv, network->mode);
4620 7045
4621 if (!(priv->config & CFG_STATIC_ESSID)) { 7046 if (!(priv->config & CFG_STATIC_ESSID)) {
4622 priv->essid_len = min(network->ssid_len, 7047 priv->essid_len = min(network->ssid_len,
@@ -4631,14 +7056,22 @@ static int ipw_associate_network(struct ipw_priv *priv,
4631 if ((priv->capability & CAP_PRIVACY_ON) && 7056 if ((priv->capability & CAP_PRIVACY_ON) &&
4632 (priv->capability & CAP_SHARED_KEY)) { 7057 (priv->capability & CAP_SHARED_KEY)) {
4633 priv->assoc_request.auth_type = AUTH_SHARED_KEY; 7058 priv->assoc_request.auth_type = AUTH_SHARED_KEY;
4634 priv->assoc_request.auth_key = priv->sec.active_key; 7059 priv->assoc_request.auth_key = priv->ieee->sec.active_key;
7060
7061 if ((priv->capability & CAP_PRIVACY_ON) &&
7062 (priv->ieee->sec.level == SEC_LEVEL_1) &&
7063 !(priv->ieee->host_encrypt || priv->ieee->host_decrypt))
7064 ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP);
4635 } else { 7065 } else {
4636 priv->assoc_request.auth_type = AUTH_OPEN; 7066 priv->assoc_request.auth_type = AUTH_OPEN;
4637 priv->assoc_request.auth_key = 0; 7067 priv->assoc_request.auth_key = 0;
4638 } 7068 }
4639 7069
4640 if (priv->capability & CAP_PRIVACY_ON) 7070 if (priv->ieee->wpa_ie_len) {
4641 ipw_send_wep_keys(priv); 7071 priv->assoc_request.policy_support = 0x02; /* RSN active */
7072 ipw_set_rsn_capa(priv, priv->ieee->wpa_ie,
7073 priv->ieee->wpa_ie_len);
7074 }
4642 7075
4643 /* 7076 /*
4644 * It is valid for our ieee device to support multiple modes, but 7077 * It is valid for our ieee device to support multiple modes, but
@@ -4652,20 +7085,41 @@ static int ipw_associate_network(struct ipw_priv *priv,
4652 else if (network->mode & priv->ieee->mode & IEEE_B) 7085 else if (network->mode & priv->ieee->mode & IEEE_B)
4653 priv->assoc_request.ieee_mode = IPW_B_MODE; 7086 priv->assoc_request.ieee_mode = IPW_B_MODE;
4654 7087
7088 priv->assoc_request.capability = network->capability;
7089 if ((network->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
7090 && !(priv->config & CFG_PREAMBLE_LONG)) {
7091 priv->assoc_request.preamble_length = DCT_FLAG_SHORT_PREAMBLE;
7092 } else {
7093 priv->assoc_request.preamble_length = DCT_FLAG_LONG_PREAMBLE;
7094
7095 /* Clear the short preamble if we won't be supporting it */
7096 priv->assoc_request.capability &=
7097 ~WLAN_CAPABILITY_SHORT_PREAMBLE;
7098 }
7099
7100 /* Clear capability bits that aren't used in Ad Hoc */
7101 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
7102 priv->assoc_request.capability &=
7103 ~WLAN_CAPABILITY_SHORT_SLOT_TIME;
7104
4655 IPW_DEBUG_ASSOC("%sssocation attempt: '%s', channel %d, " 7105 IPW_DEBUG_ASSOC("%sssocation attempt: '%s', channel %d, "
4656 "802.11%c [%d], enc=%s%s%s%c%c\n", 7106 "802.11%c [%d], %s[:%s], enc=%s%s%s%c%c\n",
4657 roaming ? "Rea" : "A", 7107 roaming ? "Rea" : "A",
4658 escape_essid(priv->essid, priv->essid_len), 7108 escape_essid(priv->essid, priv->essid_len),
4659 network->channel, 7109 network->channel,
4660 ipw_modes[priv->assoc_request.ieee_mode], 7110 ipw_modes[priv->assoc_request.ieee_mode],
4661 rates->num_rates, 7111 rates->num_rates,
7112 (priv->assoc_request.preamble_length ==
7113 DCT_FLAG_LONG_PREAMBLE) ? "long" : "short",
7114 network->capability &
7115 WLAN_CAPABILITY_SHORT_PREAMBLE ? "short" : "long",
4662 priv->capability & CAP_PRIVACY_ON ? "on " : "off", 7116 priv->capability & CAP_PRIVACY_ON ? "on " : "off",
4663 priv->capability & CAP_PRIVACY_ON ? 7117 priv->capability & CAP_PRIVACY_ON ?
4664 (priv->capability & CAP_SHARED_KEY ? "(shared)" : 7118 (priv->capability & CAP_SHARED_KEY ? "(shared)" :
4665 "(open)") : "", 7119 "(open)") : "",
4666 priv->capability & CAP_PRIVACY_ON ? " key=" : "", 7120 priv->capability & CAP_PRIVACY_ON ? " key=" : "",
4667 priv->capability & CAP_PRIVACY_ON ? 7121 priv->capability & CAP_PRIVACY_ON ?
4668 '1' + priv->sec.active_key : '.', 7122 '1' + priv->ieee->sec.active_key : '.',
4669 priv->capability & CAP_PRIVACY_ON ? '.' : ' '); 7123 priv->capability & CAP_PRIVACY_ON ? '.' : ' ');
4670 7124
4671 priv->assoc_request.beacon_interval = network->beacon_interval; 7125 priv->assoc_request.beacon_interval = network->beacon_interval;
@@ -4683,17 +7137,16 @@ static int ipw_associate_network(struct ipw_priv *priv,
4683 priv->assoc_request.assoc_tsf_lsw = network->time_stamp[0]; 7137 priv->assoc_request.assoc_tsf_lsw = network->time_stamp[0];
4684 } 7138 }
4685 7139
4686 memcpy(&priv->assoc_request.bssid, network->bssid, ETH_ALEN); 7140 memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN);
4687 7141
4688 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { 7142 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
4689 memset(&priv->assoc_request.dest, 0xFF, ETH_ALEN); 7143 memset(&priv->assoc_request.dest, 0xFF, ETH_ALEN);
4690 priv->assoc_request.atim_window = network->atim_window; 7144 priv->assoc_request.atim_window = network->atim_window;
4691 } else { 7145 } else {
4692 memcpy(&priv->assoc_request.dest, network->bssid, ETH_ALEN); 7146 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN);
4693 priv->assoc_request.atim_window = 0; 7147 priv->assoc_request.atim_window = 0;
4694 } 7148 }
4695 7149
4696 priv->assoc_request.capability = network->capability;
4697 priv->assoc_request.listen_interval = network->listen_interval; 7150 priv->assoc_request.listen_interval = network->listen_interval;
4698 7151
4699 err = ipw_send_ssid(priv, priv->essid, priv->essid_len); 7152 err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
@@ -4710,6 +7163,12 @@ static int ipw_associate_network(struct ipw_priv *priv,
4710 priv->sys_config.dot11g_auto_detection = 1; 7163 priv->sys_config.dot11g_auto_detection = 1;
4711 else 7164 else
4712 priv->sys_config.dot11g_auto_detection = 0; 7165 priv->sys_config.dot11g_auto_detection = 0;
7166
7167 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
7168 priv->sys_config.answer_broadcast_ssid_probe = 1;
7169 else
7170 priv->sys_config.answer_broadcast_ssid_probe = 0;
7171
4713 err = ipw_send_system_config(priv, &priv->sys_config); 7172 err = ipw_send_system_config(priv, &priv->sys_config);
4714 if (err) { 7173 if (err) {
4715 IPW_DEBUG_HC("Attempt to send sys config command failed.\n"); 7174 IPW_DEBUG_HC("Attempt to send sys config command failed.\n");
@@ -4717,7 +7176,7 @@ static int ipw_associate_network(struct ipw_priv *priv,
4717 } 7176 }
4718 7177
4719 IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network->stats.rssi); 7178 IPW_DEBUG_ASSOC("Association sensitivity: %d\n", network->stats.rssi);
4720 err = ipw_set_sensitivity(priv, network->stats.rssi); 7179 err = ipw_set_sensitivity(priv, network->stats.rssi + IPW_RSSI_TO_DBM);
4721 if (err) { 7180 if (err) {
4722 IPW_DEBUG_HC("Attempt to send associate command failed.\n"); 7181 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
4723 return err; 7182 return err;
@@ -4735,6 +7194,10 @@ static int ipw_associate_network(struct ipw_priv *priv,
4735 7194
4736 priv->assoc_network = network; 7195 priv->assoc_network = network;
4737 7196
7197#ifdef CONFIG_IPW_QOS
7198 ipw_qos_association(priv, network);
7199#endif
7200
4738 err = ipw_send_associate(priv, &priv->assoc_request); 7201 err = ipw_send_associate(priv, &priv->assoc_request);
4739 if (err) { 7202 if (err) {
4740 IPW_DEBUG_HC("Attempt to send associate command failed.\n"); 7203 IPW_DEBUG_HC("Attempt to send associate command failed.\n");
@@ -4782,12 +7245,15 @@ static void ipw_roam(void *data)
4782 if (priv->status & STATUS_ASSOCIATED) { 7245 if (priv->status & STATUS_ASSOCIATED) {
4783 /* First pass through ROAM process -- look for a better 7246 /* First pass through ROAM process -- look for a better
4784 * network */ 7247 * network */
7248 unsigned long flags;
4785 u8 rssi = priv->assoc_network->stats.rssi; 7249 u8 rssi = priv->assoc_network->stats.rssi;
4786 priv->assoc_network->stats.rssi = -128; 7250 priv->assoc_network->stats.rssi = -128;
7251 spin_lock_irqsave(&priv->ieee->lock, flags);
4787 list_for_each_entry(network, &priv->ieee->network_list, list) { 7252 list_for_each_entry(network, &priv->ieee->network_list, list) {
4788 if (network != priv->assoc_network) 7253 if (network != priv->assoc_network)
4789 ipw_best_network(priv, &match, network, 1); 7254 ipw_best_network(priv, &match, network, 1);
4790 } 7255 }
7256 spin_unlock_irqrestore(&priv->ieee->lock, flags);
4791 priv->assoc_network->stats.rssi = rssi; 7257 priv->assoc_network->stats.rssi = rssi;
4792 7258
4793 if (match.network == priv->assoc_network) { 7259 if (match.network == priv->assoc_network) {
@@ -4810,7 +7276,15 @@ static void ipw_roam(void *data)
4810 priv->status &= ~STATUS_ROAMING; 7276 priv->status &= ~STATUS_ROAMING;
4811} 7277}
4812 7278
4813static void ipw_associate(void *data) 7279static void ipw_bg_roam(void *data)
7280{
7281 struct ipw_priv *priv = data;
7282 down(&priv->sem);
7283 ipw_roam(data);
7284 up(&priv->sem);
7285}
7286
7287static int ipw_associate(void *data)
4814{ 7288{
4815 struct ipw_priv *priv = data; 7289 struct ipw_priv *priv = data;
4816 7290
@@ -4820,14 +7294,41 @@ static void ipw_associate(void *data)
4820 }; 7294 };
4821 struct ipw_supported_rates *rates; 7295 struct ipw_supported_rates *rates;
4822 struct list_head *element; 7296 struct list_head *element;
7297 unsigned long flags;
7298
7299 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7300 IPW_DEBUG_ASSOC("Not attempting association (monitor mode)\n");
7301 return 0;
7302 }
7303
7304 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
7305 IPW_DEBUG_ASSOC("Not attempting association (already in "
7306 "progress)\n");
7307 return 0;
7308 }
7309
7310 if (priv->status & STATUS_DISASSOCIATING) {
7311 IPW_DEBUG_ASSOC("Not attempting association (in "
7312 "disassociating)\n ");
7313 queue_work(priv->workqueue, &priv->associate);
7314 return 0;
7315 }
7316
7317 if (!ipw_is_init(priv) || (priv->status & STATUS_SCANNING)) {
7318 IPW_DEBUG_ASSOC("Not attempting association (scanning or not "
7319 "initialized)\n");
7320 return 0;
7321 }
4823 7322
4824 if (!(priv->config & CFG_ASSOCIATE) && 7323 if (!(priv->config & CFG_ASSOCIATE) &&
4825 !(priv->config & (CFG_STATIC_ESSID | 7324 !(priv->config & (CFG_STATIC_ESSID |
4826 CFG_STATIC_CHANNEL | CFG_STATIC_BSSID))) { 7325 CFG_STATIC_CHANNEL | CFG_STATIC_BSSID))) {
4827 IPW_DEBUG_ASSOC("Not attempting association (associate=0)\n"); 7326 IPW_DEBUG_ASSOC("Not attempting association (associate=0)\n");
4828 return; 7327 return 0;
4829 } 7328 }
4830 7329
7330 /* Protect our use of the network_list */
7331 spin_lock_irqsave(&priv->ieee->lock, flags);
4831 list_for_each_entry(network, &priv->ieee->network_list, list) 7332 list_for_each_entry(network, &priv->ieee->network_list, list)
4832 ipw_best_network(priv, &match, network, 0); 7333 ipw_best_network(priv, &match, network, 0);
4833 7334
@@ -4838,6 +7339,7 @@ static void ipw_associate(void *data)
4838 priv->ieee->iw_mode == IW_MODE_ADHOC && 7339 priv->ieee->iw_mode == IW_MODE_ADHOC &&
4839 priv->config & CFG_ADHOC_CREATE && 7340 priv->config & CFG_ADHOC_CREATE &&
4840 priv->config & CFG_STATIC_ESSID && 7341 priv->config & CFG_STATIC_ESSID &&
7342 priv->config & CFG_STATIC_CHANNEL &&
4841 !list_empty(&priv->ieee->network_free_list)) { 7343 !list_empty(&priv->ieee->network_free_list)) {
4842 element = priv->ieee->network_free_list.next; 7344 element = priv->ieee->network_free_list.next;
4843 network = list_entry(element, struct ieee80211_network, list); 7345 network = list_entry(element, struct ieee80211_network, list);
@@ -4846,25 +7348,83 @@ static void ipw_associate(void *data)
4846 list_del(element); 7348 list_del(element);
4847 list_add_tail(&network->list, &priv->ieee->network_list); 7349 list_add_tail(&network->list, &priv->ieee->network_list);
4848 } 7350 }
7351 spin_unlock_irqrestore(&priv->ieee->lock, flags);
4849 7352
4850 /* If we reached the end of the list, then we don't have any valid 7353 /* If we reached the end of the list, then we don't have any valid
4851 * matching APs */ 7354 * matching APs */
4852 if (!network) { 7355 if (!network) {
4853 ipw_debug_config(priv); 7356 ipw_debug_config(priv);
4854 7357
4855 queue_delayed_work(priv->workqueue, &priv->request_scan, 7358 if (!(priv->status & STATUS_SCANNING)) {
4856 SCAN_INTERVAL); 7359 if (!(priv->config & CFG_SPEED_SCAN))
7360 queue_delayed_work(priv->workqueue,
7361 &priv->request_scan,
7362 SCAN_INTERVAL);
7363 else
7364 queue_work(priv->workqueue,
7365 &priv->request_scan);
7366 }
4857 7367
4858 return; 7368 return 0;
4859 } 7369 }
4860 7370
4861 ipw_associate_network(priv, network, rates, 0); 7371 ipw_associate_network(priv, network, rates, 0);
7372
7373 return 1;
4862} 7374}
4863 7375
4864static inline void ipw_handle_data_packet(struct ipw_priv *priv, 7376static void ipw_bg_associate(void *data)
4865 struct ipw_rx_mem_buffer *rxb,
4866 struct ieee80211_rx_stats *stats)
4867{ 7377{
7378 struct ipw_priv *priv = data;
7379 down(&priv->sem);
7380 ipw_associate(data);
7381 up(&priv->sem);
7382}
7383
7384static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
7385 struct sk_buff *skb)
7386{
7387 struct ieee80211_hdr *hdr;
7388 u16 fc;
7389
7390 hdr = (struct ieee80211_hdr *)skb->data;
7391 fc = le16_to_cpu(hdr->frame_ctl);
7392 if (!(fc & IEEE80211_FCTL_PROTECTED))
7393 return;
7394
7395 fc &= ~IEEE80211_FCTL_PROTECTED;
7396 hdr->frame_ctl = cpu_to_le16(fc);
7397 switch (priv->ieee->sec.level) {
7398 case SEC_LEVEL_3:
7399 /* Remove CCMP HDR */
7400 memmove(skb->data + IEEE80211_3ADDR_LEN,
7401 skb->data + IEEE80211_3ADDR_LEN + 8,
7402 skb->len - IEEE80211_3ADDR_LEN - 8);
7403 skb_trim(skb, skb->len - 16); /* CCMP_HDR_LEN + CCMP_MIC_LEN */
7404 break;
7405 case SEC_LEVEL_2:
7406 break;
7407 case SEC_LEVEL_1:
7408 /* Remove IV */
7409 memmove(skb->data + IEEE80211_3ADDR_LEN,
7410 skb->data + IEEE80211_3ADDR_LEN + 4,
7411 skb->len - IEEE80211_3ADDR_LEN - 4);
7412 skb_trim(skb, skb->len - 8); /* IV + ICV */
7413 break;
7414 case SEC_LEVEL_0:
7415 break;
7416 default:
7417 printk(KERN_ERR "Unknow security level %d\n",
7418 priv->ieee->sec.level);
7419 break;
7420 }
7421}
7422
7423static void ipw_handle_data_packet(struct ipw_priv *priv,
7424 struct ipw_rx_mem_buffer *rxb,
7425 struct ieee80211_rx_stats *stats)
7426{
7427 struct ieee80211_hdr_4addr *hdr;
4868 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data; 7428 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data;
4869 7429
4870 /* We received data from the HW, so stop the watchdog */ 7430 /* We received data from the HW, so stop the watchdog */
@@ -4872,7 +7432,7 @@ static inline void ipw_handle_data_packet(struct ipw_priv *priv,
4872 7432
4873 /* We only process data packets if the 7433 /* We only process data packets if the
4874 * interface is open */ 7434 * interface is open */
4875 if (unlikely((pkt->u.frame.length + IPW_RX_FRAME_SIZE) > 7435 if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) >
4876 skb_tailroom(rxb->skb))) { 7436 skb_tailroom(rxb->skb))) {
4877 priv->ieee->stats.rx_errors++; 7437 priv->ieee->stats.rx_errors++;
4878 priv->wstats.discard.misc++; 7438 priv->wstats.discard.misc++;
@@ -4889,14 +7449,351 @@ static inline void ipw_handle_data_packet(struct ipw_priv *priv,
4889 skb_reserve(rxb->skb, offsetof(struct ipw_rx_packet, u.frame.data)); 7449 skb_reserve(rxb->skb, offsetof(struct ipw_rx_packet, u.frame.data));
4890 7450
4891 /* Set the size of the skb to the size of the frame */ 7451 /* Set the size of the skb to the size of the frame */
4892 skb_put(rxb->skb, pkt->u.frame.length); 7452 skb_put(rxb->skb, le16_to_cpu(pkt->u.frame.length));
4893 7453
4894 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len); 7454 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len);
4895 7455
7456 /* HW decrypt will not clear the WEP bit, MIC, PN, etc. */
7457 hdr = (struct ieee80211_hdr_4addr *)rxb->skb->data;
7458 if (priv->ieee->iw_mode != IW_MODE_MONITOR &&
7459 ((is_multicast_ether_addr(hdr->addr1) ||
7460 is_broadcast_ether_addr(hdr->addr1)) ?
7461 !priv->ieee->host_mc_decrypt : !priv->ieee->host_decrypt))
7462 ipw_rebuild_decrypted_skb(priv, rxb->skb);
7463
4896 if (!ieee80211_rx(priv->ieee, rxb->skb, stats)) 7464 if (!ieee80211_rx(priv->ieee, rxb->skb, stats))
4897 priv->ieee->stats.rx_errors++; 7465 priv->ieee->stats.rx_errors++;
4898 else /* ieee80211_rx succeeded, so it now owns the SKB */ 7466 else { /* ieee80211_rx succeeded, so it now owns the SKB */
4899 rxb->skb = NULL; 7467 rxb->skb = NULL;
7468 __ipw_led_activity_on(priv);
7469 }
7470}
7471
7472#ifdef CONFIG_IEEE80211_RADIOTAP
7473static void ipw_handle_data_packet_monitor(struct ipw_priv *priv,
7474 struct ipw_rx_mem_buffer *rxb,
7475 struct ieee80211_rx_stats *stats)
7476{
7477 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)rxb->skb->data;
7478 struct ipw_rx_frame *frame = &pkt->u.frame;
7479
7480 /* initial pull of some data */
7481 u16 received_channel = frame->received_channel;
7482 u8 antennaAndPhy = frame->antennaAndPhy;
7483 s8 antsignal = frame->rssi_dbm - IPW_RSSI_TO_DBM; /* call it signed anyhow */
7484 u16 pktrate = frame->rate;
7485
7486 /* Magic struct that slots into the radiotap header -- no reason
7487 * to build this manually element by element, we can write it much
7488 * more efficiently than we can parse it. ORDER MATTERS HERE */
7489 struct ipw_rt_hdr {
7490 struct ieee80211_radiotap_header rt_hdr;
7491 u8 rt_flags; /* radiotap packet flags */
7492 u8 rt_rate; /* rate in 500kb/s */
7493 u16 rt_channel; /* channel in mhz */
7494 u16 rt_chbitmask; /* channel bitfield */
7495 s8 rt_dbmsignal; /* signal in dbM, kluged to signed */
7496 u8 rt_antenna; /* antenna number */
7497 } *ipw_rt;
7498
7499 short len = le16_to_cpu(pkt->u.frame.length);
7500
7501 /* We received data from the HW, so stop the watchdog */
7502 priv->net_dev->trans_start = jiffies;
7503
7504 /* We only process data packets if the
7505 * interface is open */
7506 if (unlikely((le16_to_cpu(pkt->u.frame.length) + IPW_RX_FRAME_SIZE) >
7507 skb_tailroom(rxb->skb))) {
7508 priv->ieee->stats.rx_errors++;
7509 priv->wstats.discard.misc++;
7510 IPW_DEBUG_DROP("Corruption detected! Oh no!\n");
7511 return;
7512 } else if (unlikely(!netif_running(priv->net_dev))) {
7513 priv->ieee->stats.rx_dropped++;
7514 priv->wstats.discard.misc++;
7515 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
7516 return;
7517 }
7518
7519 /* Libpcap 0.9.3+ can handle variable length radiotap, so we'll use
7520 * that now */
7521 if (len > IPW_RX_BUF_SIZE - sizeof(struct ipw_rt_hdr)) {
7522 /* FIXME: Should alloc bigger skb instead */
7523 priv->ieee->stats.rx_dropped++;
7524 priv->wstats.discard.misc++;
7525 IPW_DEBUG_DROP("Dropping too large packet in monitor\n");
7526 return;
7527 }
7528
7529 /* copy the frame itself */
7530 memmove(rxb->skb->data + sizeof(struct ipw_rt_hdr),
7531 rxb->skb->data + IPW_RX_FRAME_SIZE, len);
7532
7533 /* Zero the radiotap static buffer ... We only need to zero the bytes NOT
7534 * part of our real header, saves a little time.
7535 *
7536 * No longer necessary since we fill in all our data. Purge before merging
7537 * patch officially.
7538 * memset(rxb->skb->data + sizeof(struct ipw_rt_hdr), 0,
7539 * IEEE80211_RADIOTAP_HDRLEN - sizeof(struct ipw_rt_hdr));
7540 */
7541
7542 ipw_rt = (struct ipw_rt_hdr *)rxb->skb->data;
7543
7544 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
7545 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */
7546 ipw_rt->rt_hdr.it_len = sizeof(struct ipw_rt_hdr); /* total header+data */
7547
7548 /* Big bitfield of all the fields we provide in radiotap */
7549 ipw_rt->rt_hdr.it_present =
7550 ((1 << IEEE80211_RADIOTAP_FLAGS) |
7551 (1 << IEEE80211_RADIOTAP_RATE) |
7552 (1 << IEEE80211_RADIOTAP_CHANNEL) |
7553 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |
7554 (1 << IEEE80211_RADIOTAP_ANTENNA));
7555
7556 /* Zero the flags, we'll add to them as we go */
7557 ipw_rt->rt_flags = 0;
7558
7559 /* Convert signal to DBM */
7560 ipw_rt->rt_dbmsignal = antsignal;
7561
7562 /* Convert the channel data and set the flags */
7563 ipw_rt->rt_channel = cpu_to_le16(ieee80211chan2mhz(received_channel));
7564 if (received_channel > 14) { /* 802.11a */
7565 ipw_rt->rt_chbitmask =
7566 cpu_to_le16((IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ));
7567 } else if (antennaAndPhy & 32) { /* 802.11b */
7568 ipw_rt->rt_chbitmask =
7569 cpu_to_le16((IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ));
7570 } else { /* 802.11g */
7571 ipw_rt->rt_chbitmask =
7572 (IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ);
7573 }
7574
7575 /* set the rate in multiples of 500k/s */
7576 switch (pktrate) {
7577 case IPW_TX_RATE_1MB:
7578 ipw_rt->rt_rate = 2;
7579 break;
7580 case IPW_TX_RATE_2MB:
7581 ipw_rt->rt_rate = 4;
7582 break;
7583 case IPW_TX_RATE_5MB:
7584 ipw_rt->rt_rate = 10;
7585 break;
7586 case IPW_TX_RATE_6MB:
7587 ipw_rt->rt_rate = 12;
7588 break;
7589 case IPW_TX_RATE_9MB:
7590 ipw_rt->rt_rate = 18;
7591 break;
7592 case IPW_TX_RATE_11MB:
7593 ipw_rt->rt_rate = 22;
7594 break;
7595 case IPW_TX_RATE_12MB:
7596 ipw_rt->rt_rate = 24;
7597 break;
7598 case IPW_TX_RATE_18MB:
7599 ipw_rt->rt_rate = 36;
7600 break;
7601 case IPW_TX_RATE_24MB:
7602 ipw_rt->rt_rate = 48;
7603 break;
7604 case IPW_TX_RATE_36MB:
7605 ipw_rt->rt_rate = 72;
7606 break;
7607 case IPW_TX_RATE_48MB:
7608 ipw_rt->rt_rate = 96;
7609 break;
7610 case IPW_TX_RATE_54MB:
7611 ipw_rt->rt_rate = 108;
7612 break;
7613 default:
7614 ipw_rt->rt_rate = 0;
7615 break;
7616 }
7617
7618 /* antenna number */
7619 ipw_rt->rt_antenna = (antennaAndPhy & 3); /* Is this right? */
7620
7621 /* set the preamble flag if we have it */
7622 if ((antennaAndPhy & 64))
7623 ipw_rt->rt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
7624
7625 /* Set the size of the skb to the size of the frame */
7626 skb_put(rxb->skb, len + sizeof(struct ipw_rt_hdr));
7627
7628 IPW_DEBUG_RX("Rx packet of %d bytes.\n", rxb->skb->len);
7629
7630 if (!ieee80211_rx(priv->ieee, rxb->skb, stats))
7631 priv->ieee->stats.rx_errors++;
7632 else { /* ieee80211_rx succeeded, so it now owns the SKB */
7633 rxb->skb = NULL;
7634 /* no LED during capture */
7635 }
7636}
7637#endif
7638
7639static inline int is_network_packet(struct ipw_priv *priv,
7640 struct ieee80211_hdr_4addr *header)
7641{
7642 /* Filter incoming packets to determine if they are targetted toward
7643 * this network, discarding packets coming from ourselves */
7644 switch (priv->ieee->iw_mode) {
7645 case IW_MODE_ADHOC: /* Header: Dest. | Source | BSSID */
7646 /* packets from our adapter are dropped (echo) */
7647 if (!memcmp(header->addr2, priv->net_dev->dev_addr, ETH_ALEN))
7648 return 0;
7649
7650 /* {broad,multi}cast packets to our BSSID go through */
7651 if (is_multicast_ether_addr(header->addr1) ||
7652 is_broadcast_ether_addr(header->addr1))
7653 return !memcmp(header->addr3, priv->bssid, ETH_ALEN);
7654
7655 /* packets to our adapter go through */
7656 return !memcmp(header->addr1, priv->net_dev->dev_addr,
7657 ETH_ALEN);
7658
7659 case IW_MODE_INFRA: /* Header: Dest. | BSSID | Source */
7660 /* packets from our adapter are dropped (echo) */
7661 if (!memcmp(header->addr3, priv->net_dev->dev_addr, ETH_ALEN))
7662 return 0;
7663
7664 /* {broad,multi}cast packets to our BSS go through */
7665 if (is_multicast_ether_addr(header->addr1) ||
7666 is_broadcast_ether_addr(header->addr1))
7667 return !memcmp(header->addr2, priv->bssid, ETH_ALEN);
7668
7669 /* packets to our adapter go through */
7670 return !memcmp(header->addr1, priv->net_dev->dev_addr,
7671 ETH_ALEN);
7672 }
7673
7674 return 1;
7675}
7676
7677#define IPW_PACKET_RETRY_TIME HZ
7678
7679static inline int is_duplicate_packet(struct ipw_priv *priv,
7680 struct ieee80211_hdr_4addr *header)
7681{
7682 u16 sc = le16_to_cpu(header->seq_ctl);
7683 u16 seq = WLAN_GET_SEQ_SEQ(sc);
7684 u16 frag = WLAN_GET_SEQ_FRAG(sc);
7685 u16 *last_seq, *last_frag;
7686 unsigned long *last_time;
7687
7688 switch (priv->ieee->iw_mode) {
7689 case IW_MODE_ADHOC:
7690 {
7691 struct list_head *p;
7692 struct ipw_ibss_seq *entry = NULL;
7693 u8 *mac = header->addr2;
7694 int index = mac[5] % IPW_IBSS_MAC_HASH_SIZE;
7695
7696 __list_for_each(p, &priv->ibss_mac_hash[index]) {
7697 entry =
7698 list_entry(p, struct ipw_ibss_seq, list);
7699 if (!memcmp(entry->mac, mac, ETH_ALEN))
7700 break;
7701 }
7702 if (p == &priv->ibss_mac_hash[index]) {
7703 entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
7704 if (!entry) {
7705 IPW_ERROR
7706 ("Cannot malloc new mac entry\n");
7707 return 0;
7708 }
7709 memcpy(entry->mac, mac, ETH_ALEN);
7710 entry->seq_num = seq;
7711 entry->frag_num = frag;
7712 entry->packet_time = jiffies;
7713 list_add(&entry->list,
7714 &priv->ibss_mac_hash[index]);
7715 return 0;
7716 }
7717 last_seq = &entry->seq_num;
7718 last_frag = &entry->frag_num;
7719 last_time = &entry->packet_time;
7720 break;
7721 }
7722 case IW_MODE_INFRA:
7723 last_seq = &priv->last_seq_num;
7724 last_frag = &priv->last_frag_num;
7725 last_time = &priv->last_packet_time;
7726 break;
7727 default:
7728 return 0;
7729 }
7730 if ((*last_seq == seq) &&
7731 time_after(*last_time + IPW_PACKET_RETRY_TIME, jiffies)) {
7732 if (*last_frag == frag)
7733 goto drop;
7734 if (*last_frag + 1 != frag)
7735 /* out-of-order fragment */
7736 goto drop;
7737 } else
7738 *last_seq = seq;
7739
7740 *last_frag = frag;
7741 *last_time = jiffies;
7742 return 0;
7743
7744 drop:
7745 /* Comment this line now since we observed the card receives
7746 * duplicate packets but the FCTL_RETRY bit is not set in the
7747 * IBSS mode with fragmentation enabled.
7748 BUG_ON(!(le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_RETRY)); */
7749 return 1;
7750}
7751
7752static void ipw_handle_mgmt_packet(struct ipw_priv *priv,
7753 struct ipw_rx_mem_buffer *rxb,
7754 struct ieee80211_rx_stats *stats)
7755{
7756 struct sk_buff *skb = rxb->skb;
7757 struct ipw_rx_packet *pkt = (struct ipw_rx_packet *)skb->data;
7758 struct ieee80211_hdr_4addr *header = (struct ieee80211_hdr_4addr *)
7759 (skb->data + IPW_RX_FRAME_SIZE);
7760
7761 ieee80211_rx_mgt(priv->ieee, header, stats);
7762
7763 if (priv->ieee->iw_mode == IW_MODE_ADHOC &&
7764 ((WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) ==
7765 IEEE80211_STYPE_PROBE_RESP) ||
7766 (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl)) ==
7767 IEEE80211_STYPE_BEACON))) {
7768 if (!memcmp(header->addr3, priv->bssid, ETH_ALEN))
7769 ipw_add_station(priv, header->addr2);
7770 }
7771
7772 if (priv->config & CFG_NET_STATS) {
7773 IPW_DEBUG_HC("sending stat packet\n");
7774
7775 /* Set the size of the skb to the size of the full
7776 * ipw header and 802.11 frame */
7777 skb_put(skb, le16_to_cpu(pkt->u.frame.length) +
7778 IPW_RX_FRAME_SIZE);
7779
7780 /* Advance past the ipw packet header to the 802.11 frame */
7781 skb_pull(skb, IPW_RX_FRAME_SIZE);
7782
7783 /* Push the ieee80211_rx_stats before the 802.11 frame */
7784 memcpy(skb_push(skb, sizeof(*stats)), stats, sizeof(*stats));
7785
7786 skb->dev = priv->ieee->dev;
7787
7788 /* Point raw at the ieee80211_stats */
7789 skb->mac.raw = skb->data;
7790
7791 skb->pkt_type = PACKET_OTHERHOST;
7792 skb->protocol = __constant_htons(ETH_P_80211_STATS);
7793 memset(skb->cb, 0, sizeof(rxb->skb->cb));
7794 netif_rx(skb);
7795 rxb->skb = NULL;
7796 }
4900} 7797}
4901 7798
4902/* 7799/*
@@ -4912,8 +7809,8 @@ static void ipw_rx(struct ipw_priv *priv)
4912 u32 r, w, i; 7809 u32 r, w, i;
4913 u8 network_packet; 7810 u8 network_packet;
4914 7811
4915 r = ipw_read32(priv, CX2_RX_READ_INDEX); 7812 r = ipw_read32(priv, IPW_RX_READ_INDEX);
4916 w = ipw_read32(priv, CX2_RX_WRITE_INDEX); 7813 w = ipw_read32(priv, IPW_RX_WRITE_INDEX);
4917 i = (priv->rxq->processed + 1) % RX_QUEUE_SIZE; 7814 i = (priv->rxq->processed + 1) % RX_QUEUE_SIZE;
4918 7815
4919 while (i != r) { 7816 while (i != r) {
@@ -4927,7 +7824,7 @@ static void ipw_rx(struct ipw_priv *priv)
4927 priv->rxq->queue[i] = NULL; 7824 priv->rxq->queue[i] = NULL;
4928 7825
4929 pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, 7826 pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
4930 CX2_RX_BUF_SIZE, 7827 IPW_RX_BUF_SIZE,
4931 PCI_DMA_FROMDEVICE); 7828 PCI_DMA_FROMDEVICE);
4932 7829
4933 pkt = (struct ipw_rx_packet *)rxb->skb->data; 7830 pkt = (struct ipw_rx_packet *)rxb->skb->data;
@@ -4938,9 +7835,13 @@ static void ipw_rx(struct ipw_priv *priv)
4938 switch (pkt->header.message_type) { 7835 switch (pkt->header.message_type) {
4939 case RX_FRAME_TYPE: /* 802.11 frame */ { 7836 case RX_FRAME_TYPE: /* 802.11 frame */ {
4940 struct ieee80211_rx_stats stats = { 7837 struct ieee80211_rx_stats stats = {
4941 .rssi = pkt->u.frame.rssi_dbm - 7838 .rssi =
7839 le16_to_cpu(pkt->u.frame.rssi_dbm) -
4942 IPW_RSSI_TO_DBM, 7840 IPW_RSSI_TO_DBM,
4943 .signal = pkt->u.frame.signal, 7841 .signal =
7842 le16_to_cpu(pkt->u.frame.signal),
7843 .noise =
7844 le16_to_cpu(pkt->u.frame.noise),
4944 .rate = pkt->u.frame.rate, 7845 .rate = pkt->u.frame.rate,
4945 .mac_time = jiffies, 7846 .mac_time = jiffies,
4946 .received_channel = 7847 .received_channel =
@@ -4950,22 +7851,30 @@ static void ipw_rx(struct ipw_priv *priv)
4950 control & (1 << 0)) ? 7851 control & (1 << 0)) ?
4951 IEEE80211_24GHZ_BAND : 7852 IEEE80211_24GHZ_BAND :
4952 IEEE80211_52GHZ_BAND, 7853 IEEE80211_52GHZ_BAND,
4953 .len = pkt->u.frame.length, 7854 .len = le16_to_cpu(pkt->u.frame.length),
4954 }; 7855 };
4955 7856
4956 if (stats.rssi != 0) 7857 if (stats.rssi != 0)
4957 stats.mask |= IEEE80211_STATMASK_RSSI; 7858 stats.mask |= IEEE80211_STATMASK_RSSI;
4958 if (stats.signal != 0) 7859 if (stats.signal != 0)
4959 stats.mask |= IEEE80211_STATMASK_SIGNAL; 7860 stats.mask |= IEEE80211_STATMASK_SIGNAL;
7861 if (stats.noise != 0)
7862 stats.mask |= IEEE80211_STATMASK_NOISE;
4960 if (stats.rate != 0) 7863 if (stats.rate != 0)
4961 stats.mask |= IEEE80211_STATMASK_RATE; 7864 stats.mask |= IEEE80211_STATMASK_RATE;
4962 7865
4963 priv->rx_packets++; 7866 priv->rx_packets++;
4964 7867
4965#ifdef CONFIG_IPW_PROMISC 7868#ifdef CONFIG_IPW2200_MONITOR
4966 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { 7869 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7870#ifdef CONFIG_IEEE80211_RADIOTAP
7871 ipw_handle_data_packet_monitor(priv,
7872 rxb,
7873 &stats);
7874#else
4967 ipw_handle_data_packet(priv, rxb, 7875 ipw_handle_data_packet(priv, rxb,
4968 &stats); 7876 &stats);
7877#endif
4969 break; 7878 break;
4970 } 7879 }
4971#endif 7880#endif
@@ -4979,35 +7888,9 @@ static void ipw_rx(struct ipw_priv *priv)
4979 * correctly -- we should probably use the 7888 * correctly -- we should probably use the
4980 * frame control of the packet and disregard 7889 * frame control of the packet and disregard
4981 * the current iw_mode */ 7890 * the current iw_mode */
4982 switch (priv->ieee->iw_mode) {
4983 case IW_MODE_ADHOC:
4984 network_packet =
4985 !memcmp(header->addr1,
4986 priv->net_dev->dev_addr,
4987 ETH_ALEN) ||
4988 !memcmp(header->addr3,
4989 priv->bssid, ETH_ALEN) ||
4990 is_broadcast_ether_addr(header->
4991 addr1)
4992 || is_multicast_ether_addr(header->
4993 addr1);
4994 break;
4995
4996 case IW_MODE_INFRA:
4997 default:
4998 network_packet =
4999 !memcmp(header->addr3,
5000 priv->bssid, ETH_ALEN) ||
5001 !memcmp(header->addr1,
5002 priv->net_dev->dev_addr,
5003 ETH_ALEN) ||
5004 is_broadcast_ether_addr(header->
5005 addr1)
5006 || is_multicast_ether_addr(header->
5007 addr1);
5008 break;
5009 }
5010 7891
7892 network_packet =
7893 is_network_packet(priv, header);
5011 if (network_packet && priv->assoc_network) { 7894 if (network_packet && priv->assoc_network) {
5012 priv->assoc_network->stats.rssi = 7895 priv->assoc_network->stats.rssi =
5013 stats.rssi; 7896 stats.rssi;
@@ -5017,9 +7900,10 @@ static void ipw_rx(struct ipw_priv *priv)
5017 } 7900 }
5018 7901
5019 IPW_DEBUG_RX("Frame: len=%u\n", 7902 IPW_DEBUG_RX("Frame: len=%u\n",
5020 pkt->u.frame.length); 7903 le16_to_cpu(pkt->u.frame.length));
5021 7904
5022 if (pkt->u.frame.length < frame_hdr_len(header)) { 7905 if (le16_to_cpu(pkt->u.frame.length) <
7906 frame_hdr_len(header)) {
5023 IPW_DEBUG_DROP 7907 IPW_DEBUG_DROP
5024 ("Received packet is too small. " 7908 ("Received packet is too small. "
5025 "Dropping.\n"); 7909 "Dropping.\n");
@@ -5028,34 +7912,22 @@ static void ipw_rx(struct ipw_priv *priv)
5028 break; 7912 break;
5029 } 7913 }
5030 7914
5031 switch (WLAN_FC_GET_TYPE(header->frame_ctl)) { 7915 switch (WLAN_FC_GET_TYPE
7916 (le16_to_cpu(header->frame_ctl))) {
7917
5032 case IEEE80211_FTYPE_MGMT: 7918 case IEEE80211_FTYPE_MGMT:
5033 ieee80211_rx_mgt(priv->ieee, header, 7919 ipw_handle_mgmt_packet(priv, rxb,
5034 &stats); 7920 &stats);
5035 if (priv->ieee->iw_mode == IW_MODE_ADHOC
5036 &&
5037 ((WLAN_FC_GET_STYPE
5038 (header->frame_ctl) ==
5039 IEEE80211_STYPE_PROBE_RESP)
5040 ||
5041 (WLAN_FC_GET_STYPE
5042 (header->frame_ctl) ==
5043 IEEE80211_STYPE_BEACON))
5044 && !memcmp(header->addr3,
5045 priv->bssid, ETH_ALEN))
5046 ipw_add_station(priv,
5047 header->addr2);
5048 break; 7921 break;
5049 7922
5050 case IEEE80211_FTYPE_CTL: 7923 case IEEE80211_FTYPE_CTL:
5051 break; 7924 break;
5052 7925
5053 case IEEE80211_FTYPE_DATA: 7926 case IEEE80211_FTYPE_DATA:
5054 if (network_packet) 7927 if (unlikely(!network_packet ||
5055 ipw_handle_data_packet(priv, 7928 is_duplicate_packet(priv,
5056 rxb, 7929 header)))
5057 &stats); 7930 {
5058 else
5059 IPW_DEBUG_DROP("Dropping: " 7931 IPW_DEBUG_DROP("Dropping: "
5060 MAC_FMT ", " 7932 MAC_FMT ", "
5061 MAC_FMT ", " 7933 MAC_FMT ", "
@@ -5066,6 +7938,12 @@ static void ipw_rx(struct ipw_priv *priv)
5066 addr2), 7938 addr2),
5067 MAC_ARG(header-> 7939 MAC_ARG(header->
5068 addr3)); 7940 addr3));
7941 break;
7942 }
7943
7944 ipw_handle_data_packet(priv, rxb,
7945 &stats);
7946
5069 break; 7947 break;
5070 } 7948 }
5071 break; 7949 break;
@@ -5096,7 +7974,7 @@ static void ipw_rx(struct ipw_priv *priv)
5096 } 7974 }
5097 7975
5098 pci_unmap_single(priv->pci_dev, rxb->dma_addr, 7976 pci_unmap_single(priv->pci_dev, rxb->dma_addr,
5099 CX2_RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 7977 IPW_RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
5100 list_add_tail(&rxb->list, &priv->rxq->rx_used); 7978 list_add_tail(&rxb->list, &priv->rxq->rx_used);
5101 7979
5102 i = (i + 1) % RX_QUEUE_SIZE; 7980 i = (i + 1) % RX_QUEUE_SIZE;
@@ -5108,128 +7986,129 @@ static void ipw_rx(struct ipw_priv *priv)
5108 ipw_rx_queue_restock(priv); 7986 ipw_rx_queue_restock(priv);
5109} 7987}
5110 7988
5111static void ipw_abort_scan(struct ipw_priv *priv) 7989#define DEFAULT_RTS_THRESHOLD 2304U
7990#define MIN_RTS_THRESHOLD 1U
7991#define MAX_RTS_THRESHOLD 2304U
7992#define DEFAULT_BEACON_INTERVAL 100U
7993#define DEFAULT_SHORT_RETRY_LIMIT 7U
7994#define DEFAULT_LONG_RETRY_LIMIT 4U
7995
7996static int ipw_sw_reset(struct ipw_priv *priv, int init)
5112{ 7997{
5113 int err; 7998 int band, modulation;
7999 int old_mode = priv->ieee->iw_mode;
5114 8000
5115 if (priv->status & STATUS_SCAN_ABORTING) { 8001 /* Initialize module parameter values here */
5116 IPW_DEBUG_HC("Ignoring concurrent scan abort request.\n"); 8002 priv->config = 0;
5117 return;
5118 }
5119 priv->status |= STATUS_SCAN_ABORTING;
5120 8003
5121 err = ipw_send_scan_abort(priv); 8004 /* We default to disabling the LED code as right now it causes
5122 if (err) 8005 * too many systems to lock up... */
5123 IPW_DEBUG_HC("Request to abort scan failed.\n"); 8006 if (!led)
5124} 8007 priv->config |= CFG_NO_LED;
5125 8008
5126static int ipw_request_scan(struct ipw_priv *priv) 8009 if (associate)
5127{ 8010 priv->config |= CFG_ASSOCIATE;
5128 struct ipw_scan_request_ext scan; 8011 else
5129 int channel_index = 0; 8012 IPW_DEBUG_INFO("Auto associate disabled.\n");
5130 int i, err, scan_type;
5131 8013
5132 if (priv->status & STATUS_EXIT_PENDING) { 8014 if (auto_create)
5133 IPW_DEBUG_SCAN("Aborting scan due to device shutdown\n"); 8015 priv->config |= CFG_ADHOC_CREATE;
5134 priv->status |= STATUS_SCAN_PENDING; 8016 else
5135 return 0; 8017 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
5136 }
5137 8018
5138 if (priv->status & STATUS_SCANNING) { 8019 if (disable) {
5139 IPW_DEBUG_HC("Concurrent scan requested. Aborting first.\n"); 8020 priv->status |= STATUS_RF_KILL_SW;
5140 priv->status |= STATUS_SCAN_PENDING; 8021 IPW_DEBUG_INFO("Radio disabled.\n");
5141 ipw_abort_scan(priv);
5142 return 0;
5143 } 8022 }
5144 8023
5145 if (priv->status & STATUS_SCAN_ABORTING) { 8024 if (channel != 0) {
5146 IPW_DEBUG_HC("Scan request while abort pending. Queuing.\n"); 8025 priv->config |= CFG_STATIC_CHANNEL;
5147 priv->status |= STATUS_SCAN_PENDING; 8026 priv->channel = channel;
5148 return 0; 8027 IPW_DEBUG_INFO("Bind to static channel %d\n", channel);
8028 /* TODO: Validate that provided channel is in range */
5149 } 8029 }
8030#ifdef CONFIG_IPW_QOS
8031 ipw_qos_init(priv, qos_enable, qos_burst_enable,
8032 burst_duration_CCK, burst_duration_OFDM);
8033#endif /* CONFIG_IPW_QOS */
5150 8034
5151 if (priv->status & STATUS_RF_KILL_MASK) { 8035 switch (mode) {
5152 IPW_DEBUG_HC("Aborting scan due to RF Kill activation\n"); 8036 case 1:
5153 priv->status |= STATUS_SCAN_PENDING; 8037 priv->ieee->iw_mode = IW_MODE_ADHOC;
5154 return 0; 8038 priv->net_dev->type = ARPHRD_ETHER;
8039
8040 break;
8041#ifdef CONFIG_IPW2200_MONITOR
8042 case 2:
8043 priv->ieee->iw_mode = IW_MODE_MONITOR;
8044#ifdef CONFIG_IEEE80211_RADIOTAP
8045 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
8046#else
8047 priv->net_dev->type = ARPHRD_IEEE80211;
8048#endif
8049 break;
8050#endif
8051 default:
8052 case 0:
8053 priv->net_dev->type = ARPHRD_ETHER;
8054 priv->ieee->iw_mode = IW_MODE_INFRA;
8055 break;
5155 } 8056 }
5156 8057
5157 memset(&scan, 0, sizeof(scan)); 8058 if (hwcrypto) {
8059 priv->ieee->host_encrypt = 0;
8060 priv->ieee->host_encrypt_msdu = 0;
8061 priv->ieee->host_decrypt = 0;
8062 priv->ieee->host_mc_decrypt = 0;
8063 }
8064 IPW_DEBUG_INFO("Hardware crypto [%s]\n", hwcrypto ? "on" : "off");
5158 8065
5159 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = 20; 8066 /* IPW2200/2915 is abled to do hardware fragmentation. */
5160 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = 20; 8067 priv->ieee->host_open_frag = 0;
5161 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = 20;
5162
5163 scan.full_scan_index = ieee80211_get_scans(priv->ieee);
5164 /* If we are roaming, then make this a directed scan for the current
5165 * network. Otherwise, ensure that every other scan is a fast
5166 * channel hop scan */
5167 if ((priv->status & STATUS_ROAMING)
5168 || (!(priv->status & STATUS_ASSOCIATED)
5169 && (priv->config & CFG_STATIC_ESSID)
5170 && (scan.full_scan_index % 2))) {
5171 err = ipw_send_ssid(priv, priv->essid, priv->essid_len);
5172 if (err) {
5173 IPW_DEBUG_HC("Attempt to send SSID command failed.\n");
5174 return err;
5175 }
5176 8068
5177 scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN; 8069 if ((priv->pci_dev->device == 0x4223) ||
8070 (priv->pci_dev->device == 0x4224)) {
8071 if (init)
8072 printk(KERN_INFO DRV_NAME
8073 ": Detected Intel PRO/Wireless 2915ABG Network "
8074 "Connection\n");
8075 priv->ieee->abg_true = 1;
8076 band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND;
8077 modulation = IEEE80211_OFDM_MODULATION |
8078 IEEE80211_CCK_MODULATION;
8079 priv->adapter = IPW_2915ABG;
8080 priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B;
5178 } else { 8081 } else {
5179 scan_type = IPW_SCAN_ACTIVE_BROADCAST_SCAN; 8082 if (init)
5180 } 8083 printk(KERN_INFO DRV_NAME
5181 8084 ": Detected Intel PRO/Wireless 2200BG Network "
5182 if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) { 8085 "Connection\n");
5183 int start = channel_index;
5184 for (i = 0; i < MAX_A_CHANNELS; i++) {
5185 if (band_a_active_channel[i] == 0)
5186 break;
5187 if ((priv->status & STATUS_ASSOCIATED) &&
5188 band_a_active_channel[i] == priv->channel)
5189 continue;
5190 channel_index++;
5191 scan.channels_list[channel_index] =
5192 band_a_active_channel[i];
5193 ipw_set_scan_type(&scan, channel_index, scan_type);
5194 }
5195 8086
5196 if (start != channel_index) { 8087 priv->ieee->abg_true = 0;
5197 scan.channels_list[start] = (u8) (IPW_A_MODE << 6) | 8088 band = IEEE80211_24GHZ_BAND;
5198 (channel_index - start); 8089 modulation = IEEE80211_OFDM_MODULATION |
5199 channel_index++; 8090 IEEE80211_CCK_MODULATION;
5200 } 8091 priv->adapter = IPW_2200BG;
8092 priv->ieee->mode = IEEE_G | IEEE_B;
5201 } 8093 }
5202 8094
5203 if (priv->ieee->freq_band & IEEE80211_24GHZ_BAND) { 8095 priv->ieee->freq_band = band;
5204 int start = channel_index; 8096 priv->ieee->modulation = modulation;
5205 for (i = 0; i < MAX_B_CHANNELS; i++) {
5206 if (band_b_active_channel[i] == 0)
5207 break;
5208 if ((priv->status & STATUS_ASSOCIATED) &&
5209 band_b_active_channel[i] == priv->channel)
5210 continue;
5211 channel_index++;
5212 scan.channels_list[channel_index] =
5213 band_b_active_channel[i];
5214 ipw_set_scan_type(&scan, channel_index, scan_type);
5215 }
5216 8097
5217 if (start != channel_index) { 8098 priv->rates_mask = IEEE80211_DEFAULT_RATES_MASK;
5218 scan.channels_list[start] = (u8) (IPW_B_MODE << 6) |
5219 (channel_index - start);
5220 }
5221 }
5222 8099
5223 err = ipw_send_scan_request_ext(priv, &scan); 8100 priv->disassociate_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT;
5224 if (err) { 8101 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT;
5225 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
5226 return -EIO;
5227 }
5228 8102
5229 priv->status |= STATUS_SCANNING; 8103 priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
5230 priv->status &= ~STATUS_SCAN_PENDING; 8104 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
8105 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
5231 8106
5232 return 0; 8107 /* If power management is turned on, default to AC mode */
8108 priv->power_mode = IPW_POWER_AC;
8109 priv->tx_power = IPW_TX_POWER_DEFAULT;
8110
8111 return old_mode == priv->ieee->iw_mode;
5233} 8112}
5234 8113
5235/* 8114/*
@@ -5247,12 +8126,16 @@ static int ipw_wx_get_name(struct net_device *dev,
5247 union iwreq_data *wrqu, char *extra) 8126 union iwreq_data *wrqu, char *extra)
5248{ 8127{
5249 struct ipw_priv *priv = ieee80211_priv(dev); 8128 struct ipw_priv *priv = ieee80211_priv(dev);
5250 if (!(priv->status & STATUS_ASSOCIATED)) 8129 down(&priv->sem);
8130 if (priv->status & STATUS_RF_KILL_MASK)
8131 strcpy(wrqu->name, "radio off");
8132 else if (!(priv->status & STATUS_ASSOCIATED))
5251 strcpy(wrqu->name, "unassociated"); 8133 strcpy(wrqu->name, "unassociated");
5252 else 8134 else
5253 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", 8135 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c",
5254 ipw_modes[priv->assoc_request.ieee_mode]); 8136 ipw_modes[priv->assoc_request.ieee_mode]);
5255 IPW_DEBUG_WX("Name: %s\n", wrqu->name); 8137 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
8138 up(&priv->sem);
5256 return 0; 8139 return 0;
5257} 8140}
5258 8141
@@ -5261,13 +8144,9 @@ static int ipw_set_channel(struct ipw_priv *priv, u8 channel)
5261 if (channel == 0) { 8144 if (channel == 0) {
5262 IPW_DEBUG_INFO("Setting channel to ANY (0)\n"); 8145 IPW_DEBUG_INFO("Setting channel to ANY (0)\n");
5263 priv->config &= ~CFG_STATIC_CHANNEL; 8146 priv->config &= ~CFG_STATIC_CHANNEL;
5264 if (!(priv->status & (STATUS_SCANNING | STATUS_ASSOCIATED | 8147 IPW_DEBUG_ASSOC("Attempting to associate with new "
5265 STATUS_ASSOCIATING))) { 8148 "parameters.\n");
5266 IPW_DEBUG_ASSOC("Attempting to associate with new " 8149 ipw_associate(priv);
5267 "parameters.\n");
5268 ipw_associate(priv);
5269 }
5270
5271 return 0; 8150 return 0;
5272 } 8151 }
5273 8152
@@ -5282,14 +8161,32 @@ static int ipw_set_channel(struct ipw_priv *priv, u8 channel)
5282 IPW_DEBUG_INFO("Setting channel to %i\n", (int)channel); 8161 IPW_DEBUG_INFO("Setting channel to %i\n", (int)channel);
5283 priv->channel = channel; 8162 priv->channel = channel;
5284 8163
5285 /* If we are currently associated, or trying to associate 8164#ifdef CONFIG_IPW2200_MONITOR
5286 * then see if this is a new channel (causing us to disassociate) */ 8165 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5287 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { 8166 int i;
5288 IPW_DEBUG_ASSOC("Disassociating due to channel change.\n"); 8167 if (priv->status & STATUS_SCANNING) {
5289 ipw_disassociate(priv); 8168 IPW_DEBUG_SCAN("Scan abort triggered due to "
5290 } else { 8169 "channel change.\n");
5291 ipw_associate(priv); 8170 ipw_abort_scan(priv);
8171 }
8172
8173 for (i = 1000; i && (priv->status & STATUS_SCANNING); i--)
8174 udelay(10);
8175
8176 if (priv->status & STATUS_SCANNING)
8177 IPW_DEBUG_SCAN("Still scanning...\n");
8178 else
8179 IPW_DEBUG_SCAN("Took %dms to abort current scan\n",
8180 1000 - i);
8181
8182 return 0;
5292 } 8183 }
8184#endif /* CONFIG_IPW2200_MONITOR */
8185
8186 /* Network configuration changed -- force [re]association */
8187 IPW_DEBUG_ASSOC("[re]association triggered due to channel change.\n");
8188 if (!ipw_disassociate(priv))
8189 ipw_associate(priv);
5293 8190
5294 return 0; 8191 return 0;
5295} 8192}
@@ -5299,29 +8196,48 @@ static int ipw_wx_set_freq(struct net_device *dev,
5299 union iwreq_data *wrqu, char *extra) 8196 union iwreq_data *wrqu, char *extra)
5300{ 8197{
5301 struct ipw_priv *priv = ieee80211_priv(dev); 8198 struct ipw_priv *priv = ieee80211_priv(dev);
8199 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
5302 struct iw_freq *fwrq = &wrqu->freq; 8200 struct iw_freq *fwrq = &wrqu->freq;
5303 8201 int ret = 0, i;
8202 u8 channel, flags;
8203 int band;
8204
8205 if (fwrq->m == 0) {
8206 IPW_DEBUG_WX("SET Freq/Channel -> any\n");
8207 down(&priv->sem);
8208 ret = ipw_set_channel(priv, 0);
8209 up(&priv->sem);
8210 return ret;
8211 }
5304 /* if setting by freq convert to channel */ 8212 /* if setting by freq convert to channel */
5305 if (fwrq->e == 1) { 8213 if (fwrq->e == 1) {
5306 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) { 8214 channel = ipw_freq_to_channel(priv->ieee, fwrq->m);
5307 int f = fwrq->m / 100000; 8215 if (channel == 0)
5308 int c = 0; 8216 return -EINVAL;
8217 } else
8218 channel = fwrq->m;
8219
8220 if (!(band = ipw_is_valid_channel(priv->ieee, channel)))
8221 return -EINVAL;
5309 8222
5310 while ((c < REG_MAX_CHANNEL) && 8223 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5311 (f != ipw_frequencies[c])) 8224 i = ipw_channel_to_index(priv->ieee, channel);
5312 c++; 8225 if (i == -1)
8226 return -EINVAL;
5313 8227
5314 /* hack to fall through */ 8228 flags = (band == IEEE80211_24GHZ_BAND) ?
5315 fwrq->e = 0; 8229 geo->bg[i].flags : geo->a[i].flags;
5316 fwrq->m = c + 1; 8230 if (flags & IEEE80211_CH_PASSIVE_ONLY) {
8231 IPW_DEBUG_WX("Invalid Ad-Hoc channel for 802.11a\n");
8232 return -EINVAL;
5317 } 8233 }
5318 } 8234 }
5319 8235
5320 if (fwrq->e > 0 || fwrq->m > 1000)
5321 return -EOPNOTSUPP;
5322
5323 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m); 8236 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
5324 return ipw_set_channel(priv, (u8) fwrq->m); 8237 down(&priv->sem);
8238 ret = ipw_set_channel(priv, channel);
8239 up(&priv->sem);
8240 return ret;
5325} 8241}
5326 8242
5327static int ipw_wx_get_freq(struct net_device *dev, 8243static int ipw_wx_get_freq(struct net_device *dev,
@@ -5334,12 +8250,14 @@ static int ipw_wx_get_freq(struct net_device *dev,
5334 8250
5335 /* If we are associated, trying to associate, or have a statically 8251 /* If we are associated, trying to associate, or have a statically
5336 * configured CHANNEL then return that; otherwise return ANY */ 8252 * configured CHANNEL then return that; otherwise return ANY */
8253 down(&priv->sem);
5337 if (priv->config & CFG_STATIC_CHANNEL || 8254 if (priv->config & CFG_STATIC_CHANNEL ||
5338 priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) 8255 priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED))
5339 wrqu->freq.m = priv->channel; 8256 wrqu->freq.m = priv->channel;
5340 else 8257 else
5341 wrqu->freq.m = 0; 8258 wrqu->freq.m = 0;
5342 8259
8260 up(&priv->sem);
5343 IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel); 8261 IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel);
5344 return 0; 8262 return 0;
5345} 8263}
@@ -5353,11 +8271,8 @@ static int ipw_wx_set_mode(struct net_device *dev,
5353 8271
5354 IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode); 8272 IPW_DEBUG_WX("Set MODE: %d\n", wrqu->mode);
5355 8273
5356 if (wrqu->mode == priv->ieee->iw_mode)
5357 return 0;
5358
5359 switch (wrqu->mode) { 8274 switch (wrqu->mode) {
5360#ifdef CONFIG_IPW_PROMISC 8275#ifdef CONFIG_IPW2200_MONITOR
5361 case IW_MODE_MONITOR: 8276 case IW_MODE_MONITOR:
5362#endif 8277#endif
5363 case IW_MODE_ADHOC: 8278 case IW_MODE_ADHOC:
@@ -5369,31 +8284,33 @@ static int ipw_wx_set_mode(struct net_device *dev,
5369 default: 8284 default:
5370 return -EINVAL; 8285 return -EINVAL;
5371 } 8286 }
8287 if (wrqu->mode == priv->ieee->iw_mode)
8288 return 0;
8289
8290 down(&priv->sem);
8291
8292 ipw_sw_reset(priv, 0);
5372 8293
5373#ifdef CONFIG_IPW_PROMISC 8294#ifdef CONFIG_IPW2200_MONITOR
5374 if (priv->ieee->iw_mode == IW_MODE_MONITOR) 8295 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5375 priv->net_dev->type = ARPHRD_ETHER; 8296 priv->net_dev->type = ARPHRD_ETHER;
5376 8297
5377 if (wrqu->mode == IW_MODE_MONITOR) 8298 if (wrqu->mode == IW_MODE_MONITOR)
8299#ifdef CONFIG_IEEE80211_RADIOTAP
8300 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
8301#else
5378 priv->net_dev->type = ARPHRD_IEEE80211; 8302 priv->net_dev->type = ARPHRD_IEEE80211;
5379#endif /* CONFIG_IPW_PROMISC */ 8303#endif
8304#endif /* CONFIG_IPW2200_MONITOR */
5380 8305
5381#ifdef CONFIG_PM
5382 /* Free the existing firmware and reset the fw_loaded 8306 /* Free the existing firmware and reset the fw_loaded
5383 * flag so ipw_load() will bring in the new firmawre */ 8307 * flag so ipw_load() will bring in the new firmawre */
5384 if (fw_loaded) { 8308 free_firmware();
5385 fw_loaded = 0;
5386 }
5387
5388 release_firmware(bootfw);
5389 release_firmware(ucode);
5390 release_firmware(firmware);
5391 bootfw = ucode = firmware = NULL;
5392#endif
5393 8309
5394 priv->ieee->iw_mode = wrqu->mode; 8310 priv->ieee->iw_mode = wrqu->mode;
5395 ipw_adapter_restart(priv);
5396 8311
8312 queue_work(priv->workqueue, &priv->adapter_restart);
8313 up(&priv->sem);
5397 return err; 8314 return err;
5398} 8315}
5399 8316
@@ -5402,20 +8319,13 @@ static int ipw_wx_get_mode(struct net_device *dev,
5402 union iwreq_data *wrqu, char *extra) 8319 union iwreq_data *wrqu, char *extra)
5403{ 8320{
5404 struct ipw_priv *priv = ieee80211_priv(dev); 8321 struct ipw_priv *priv = ieee80211_priv(dev);
5405 8322 down(&priv->sem);
5406 wrqu->mode = priv->ieee->iw_mode; 8323 wrqu->mode = priv->ieee->iw_mode;
5407 IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode); 8324 IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode);
5408 8325 up(&priv->sem);
5409 return 0; 8326 return 0;
5410} 8327}
5411 8328
5412#define DEFAULT_RTS_THRESHOLD 2304U
5413#define MIN_RTS_THRESHOLD 1U
5414#define MAX_RTS_THRESHOLD 2304U
5415#define DEFAULT_BEACON_INTERVAL 100U
5416#define DEFAULT_SHORT_RETRY_LIMIT 7U
5417#define DEFAULT_LONG_RETRY_LIMIT 4U
5418
5419/* Values are in microsecond */ 8329/* Values are in microsecond */
5420static const s32 timeout_duration[] = { 8330static const s32 timeout_duration[] = {
5421 350000, 8331 350000,
@@ -5439,8 +8349,8 @@ static int ipw_wx_get_range(struct net_device *dev,
5439{ 8349{
5440 struct ipw_priv *priv = ieee80211_priv(dev); 8350 struct ipw_priv *priv = ieee80211_priv(dev);
5441 struct iw_range *range = (struct iw_range *)extra; 8351 struct iw_range *range = (struct iw_range *)extra;
5442 u16 val; 8352 const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee);
5443 int i; 8353 int i = 0, j;
5444 8354
5445 wrqu->data.length = sizeof(*range); 8355 wrqu->data.length = sizeof(*range);
5446 memset(range, 0, sizeof(*range)); 8356 memset(range, 0, sizeof(*range));
@@ -5451,7 +8361,7 @@ static int ipw_wx_get_range(struct net_device *dev,
5451 range->max_qual.qual = 100; 8361 range->max_qual.qual = 100;
5452 /* TODO: Find real max RSSI and stick here */ 8362 /* TODO: Find real max RSSI and stick here */
5453 range->max_qual.level = 0; 8363 range->max_qual.level = 0;
5454 range->max_qual.noise = 0; 8364 range->max_qual.noise = priv->ieee->worst_rssi + 0x100;
5455 range->max_qual.updated = 7; /* Updated all three */ 8365 range->max_qual.updated = 7; /* Updated all three */
5456 8366
5457 range->avg_qual.qual = 70; 8367 range->avg_qual.qual = 70;
@@ -5459,7 +8369,7 @@ static int ipw_wx_get_range(struct net_device *dev,
5459 range->avg_qual.level = 0; /* FIXME to real average level */ 8369 range->avg_qual.level = 0; /* FIXME to real average level */
5460 range->avg_qual.noise = 0; 8370 range->avg_qual.noise = 0;
5461 range->avg_qual.updated = 7; /* Updated all three */ 8371 range->avg_qual.updated = 7; /* Updated all three */
5462 8372 down(&priv->sem);
5463 range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES); 8373 range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES);
5464 8374
5465 for (i = 0; i < range->num_bitrates; i++) 8375 for (i = 0; i < range->num_bitrates; i++)
@@ -5479,19 +8389,35 @@ static int ipw_wx_get_range(struct net_device *dev,
5479 range->we_version_compiled = WIRELESS_EXT; 8389 range->we_version_compiled = WIRELESS_EXT;
5480 range->we_version_source = 16; 8390 range->we_version_source = 16;
5481 8391
5482 range->num_channels = FREQ_COUNT; 8392 i = 0;
5483 8393 if (priv->ieee->mode & (IEEE_B | IEEE_G)) {
5484 val = 0; 8394 for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES;
5485 for (i = 0; i < FREQ_COUNT; i++) { 8395 i++, j++) {
5486 range->freq[val].i = i + 1; 8396 range->freq[i].i = geo->bg[j].channel;
5487 range->freq[val].m = ipw_frequencies[i] * 100000; 8397 range->freq[i].m = geo->bg[j].freq * 100000;
5488 range->freq[val].e = 1; 8398 range->freq[i].e = 1;
5489 val++; 8399 }
8400 }
5490 8401
5491 if (val == IW_MAX_FREQUENCIES) 8402 if (priv->ieee->mode & IEEE_A) {
5492 break; 8403 for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES;
8404 i++, j++) {
8405 range->freq[i].i = geo->a[j].channel;
8406 range->freq[i].m = geo->a[j].freq * 100000;
8407 range->freq[i].e = 1;
8408 }
5493 } 8409 }
5494 range->num_frequency = val; 8410
8411 range->num_channels = i;
8412 range->num_frequency = i;
8413
8414 up(&priv->sem);
8415
8416 /* Event capability (kernel + driver) */
8417 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
8418 IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) |
8419 IW_EVENT_CAPA_MASK(SIOCGIWAP));
8420 range->event_capa[1] = IW_EVENT_CAPA_K_1;
5495 8421
5496 IPW_DEBUG_WX("GET Range\n"); 8422 IPW_DEBUG_WX("GET Range\n");
5497 return 0; 8423 return 0;
@@ -5512,25 +8438,23 @@ static int ipw_wx_set_wap(struct net_device *dev,
5512 8438
5513 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) 8439 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
5514 return -EINVAL; 8440 return -EINVAL;
5515 8441 down(&priv->sem);
5516 if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) || 8442 if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) ||
5517 !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) { 8443 !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) {
5518 /* we disable mandatory BSSID association */ 8444 /* we disable mandatory BSSID association */
5519 IPW_DEBUG_WX("Setting AP BSSID to ANY\n"); 8445 IPW_DEBUG_WX("Setting AP BSSID to ANY\n");
5520 priv->config &= ~CFG_STATIC_BSSID; 8446 priv->config &= ~CFG_STATIC_BSSID;
5521 if (!(priv->status & (STATUS_SCANNING | STATUS_ASSOCIATED | 8447 IPW_DEBUG_ASSOC("Attempting to associate with new "
5522 STATUS_ASSOCIATING))) { 8448 "parameters.\n");
5523 IPW_DEBUG_ASSOC("Attempting to associate with new " 8449 ipw_associate(priv);
5524 "parameters.\n"); 8450 up(&priv->sem);
5525 ipw_associate(priv);
5526 }
5527
5528 return 0; 8451 return 0;
5529 } 8452 }
5530 8453
5531 priv->config |= CFG_STATIC_BSSID; 8454 priv->config |= CFG_STATIC_BSSID;
5532 if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) { 8455 if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) {
5533 IPW_DEBUG_WX("BSSID set to current BSSID.\n"); 8456 IPW_DEBUG_WX("BSSID set to current BSSID.\n");
8457 up(&priv->sem);
5534 return 0; 8458 return 0;
5535 } 8459 }
5536 8460
@@ -5539,15 +8463,12 @@ static int ipw_wx_set_wap(struct net_device *dev,
5539 8463
5540 memcpy(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN); 8464 memcpy(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN);
5541 8465
5542 /* If we are currently associated, or trying to associate 8466 /* Network configuration changed -- force [re]association */
5543 * then see if this is a new BSSID (causing us to disassociate) */ 8467 IPW_DEBUG_ASSOC("[re]association triggered due to BSSID change.\n");
5544 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { 8468 if (!ipw_disassociate(priv))
5545 IPW_DEBUG_ASSOC("Disassociating due to BSSID change.\n");
5546 ipw_disassociate(priv);
5547 } else {
5548 ipw_associate(priv); 8469 ipw_associate(priv);
5549 }
5550 8470
8471 up(&priv->sem);
5551 return 0; 8472 return 0;
5552} 8473}
5553 8474
@@ -5558,15 +8479,17 @@ static int ipw_wx_get_wap(struct net_device *dev,
5558 struct ipw_priv *priv = ieee80211_priv(dev); 8479 struct ipw_priv *priv = ieee80211_priv(dev);
5559 /* If we are associated, trying to associate, or have a statically 8480 /* If we are associated, trying to associate, or have a statically
5560 * configured BSSID then return that; otherwise return ANY */ 8481 * configured BSSID then return that; otherwise return ANY */
8482 down(&priv->sem);
5561 if (priv->config & CFG_STATIC_BSSID || 8483 if (priv->config & CFG_STATIC_BSSID ||
5562 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { 8484 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
5563 wrqu->ap_addr.sa_family = ARPHRD_ETHER; 8485 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
5564 memcpy(wrqu->ap_addr.sa_data, &priv->bssid, ETH_ALEN); 8486 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
5565 } else 8487 } else
5566 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 8488 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
5567 8489
5568 IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n", 8490 IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n",
5569 MAC_ARG(wrqu->ap_addr.sa_data)); 8491 MAC_ARG(wrqu->ap_addr.sa_data));
8492 up(&priv->sem);
5570 return 0; 8493 return 0;
5571} 8494}
5572 8495
@@ -5577,21 +8500,22 @@ static int ipw_wx_set_essid(struct net_device *dev,
5577 struct ipw_priv *priv = ieee80211_priv(dev); 8500 struct ipw_priv *priv = ieee80211_priv(dev);
5578 char *essid = ""; /* ANY */ 8501 char *essid = ""; /* ANY */
5579 int length = 0; 8502 int length = 0;
5580 8503 down(&priv->sem);
5581 if (wrqu->essid.flags && wrqu->essid.length) { 8504 if (wrqu->essid.flags && wrqu->essid.length) {
5582 length = wrqu->essid.length - 1; 8505 length = wrqu->essid.length - 1;
5583 essid = extra; 8506 essid = extra;
5584 } 8507 }
5585 if (length == 0) { 8508 if (length == 0) {
5586 IPW_DEBUG_WX("Setting ESSID to ANY\n"); 8509 IPW_DEBUG_WX("Setting ESSID to ANY\n");
5587 priv->config &= ~CFG_STATIC_ESSID; 8510 if ((priv->config & CFG_STATIC_ESSID) &&
5588 if (!(priv->status & (STATUS_SCANNING | STATUS_ASSOCIATED | 8511 !(priv->status & (STATUS_ASSOCIATED |
5589 STATUS_ASSOCIATING))) { 8512 STATUS_ASSOCIATING))) {
5590 IPW_DEBUG_ASSOC("Attempting to associate with new " 8513 IPW_DEBUG_ASSOC("Attempting to associate with new "
5591 "parameters.\n"); 8514 "parameters.\n");
8515 priv->config &= ~CFG_STATIC_ESSID;
5592 ipw_associate(priv); 8516 ipw_associate(priv);
5593 } 8517 }
5594 8518 up(&priv->sem);
5595 return 0; 8519 return 0;
5596 } 8520 }
5597 8521
@@ -5601,6 +8525,7 @@ static int ipw_wx_set_essid(struct net_device *dev,
5601 8525
5602 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { 8526 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
5603 IPW_DEBUG_WX("ESSID set to current ESSID.\n"); 8527 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
8528 up(&priv->sem);
5604 return 0; 8529 return 0;
5605 } 8530 }
5606 8531
@@ -5610,15 +8535,12 @@ static int ipw_wx_set_essid(struct net_device *dev,
5610 priv->essid_len = length; 8535 priv->essid_len = length;
5611 memcpy(priv->essid, essid, priv->essid_len); 8536 memcpy(priv->essid, essid, priv->essid_len);
5612 8537
5613 /* If we are currently associated, or trying to associate 8538 /* Network configuration changed -- force [re]association */
5614 * then see if this is a new ESSID (causing us to disassociate) */ 8539 IPW_DEBUG_ASSOC("[re]association triggered due to ESSID change.\n");
5615 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { 8540 if (!ipw_disassociate(priv))
5616 IPW_DEBUG_ASSOC("Disassociating due to ESSID change.\n");
5617 ipw_disassociate(priv);
5618 } else {
5619 ipw_associate(priv); 8541 ipw_associate(priv);
5620 }
5621 8542
8543 up(&priv->sem);
5622 return 0; 8544 return 0;
5623} 8545}
5624 8546
@@ -5630,6 +8552,7 @@ static int ipw_wx_get_essid(struct net_device *dev,
5630 8552
5631 /* If we are associated, trying to associate, or have a statically 8553 /* If we are associated, trying to associate, or have a statically
5632 * configured ESSID then return that; otherwise return ANY */ 8554 * configured ESSID then return that; otherwise return ANY */
8555 down(&priv->sem);
5633 if (priv->config & CFG_STATIC_ESSID || 8556 if (priv->config & CFG_STATIC_ESSID ||
5634 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { 8557 priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
5635 IPW_DEBUG_WX("Getting essid: '%s'\n", 8558 IPW_DEBUG_WX("Getting essid: '%s'\n",
@@ -5642,7 +8565,7 @@ static int ipw_wx_get_essid(struct net_device *dev,
5642 wrqu->essid.length = 0; 8565 wrqu->essid.length = 0;
5643 wrqu->essid.flags = 0; /* active */ 8566 wrqu->essid.flags = 0; /* active */
5644 } 8567 }
5645 8568 up(&priv->sem);
5646 return 0; 8569 return 0;
5647} 8570}
5648 8571
@@ -5655,11 +8578,12 @@ static int ipw_wx_set_nick(struct net_device *dev,
5655 IPW_DEBUG_WX("Setting nick to '%s'\n", extra); 8578 IPW_DEBUG_WX("Setting nick to '%s'\n", extra);
5656 if (wrqu->data.length > IW_ESSID_MAX_SIZE) 8579 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
5657 return -E2BIG; 8580 return -E2BIG;
5658 8581 down(&priv->sem);
5659 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick)); 8582 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
5660 memset(priv->nick, 0, sizeof(priv->nick)); 8583 memset(priv->nick, 0, sizeof(priv->nick));
5661 memcpy(priv->nick, extra, wrqu->data.length); 8584 memcpy(priv->nick, extra, wrqu->data.length);
5662 IPW_DEBUG_TRACE("<<\n"); 8585 IPW_DEBUG_TRACE("<<\n");
8586 up(&priv->sem);
5663 return 0; 8587 return 0;
5664 8588
5665} 8589}
@@ -5670,9 +8594,11 @@ static int ipw_wx_get_nick(struct net_device *dev,
5670{ 8594{
5671 struct ipw_priv *priv = ieee80211_priv(dev); 8595 struct ipw_priv *priv = ieee80211_priv(dev);
5672 IPW_DEBUG_WX("Getting nick\n"); 8596 IPW_DEBUG_WX("Getting nick\n");
8597 down(&priv->sem);
5673 wrqu->data.length = strlen(priv->nick) + 1; 8598 wrqu->data.length = strlen(priv->nick) + 1;
5674 memcpy(extra, priv->nick, wrqu->data.length); 8599 memcpy(extra, priv->nick, wrqu->data.length);
5675 wrqu->data.flags = 1; /* active */ 8600 wrqu->data.flags = 1; /* active */
8601 up(&priv->sem);
5676 return 0; 8602 return 0;
5677} 8603}
5678 8604
@@ -5680,8 +8606,113 @@ static int ipw_wx_set_rate(struct net_device *dev,
5680 struct iw_request_info *info, 8606 struct iw_request_info *info,
5681 union iwreq_data *wrqu, char *extra) 8607 union iwreq_data *wrqu, char *extra)
5682{ 8608{
5683 IPW_DEBUG_WX("0x%p, 0x%p, 0x%p\n", dev, info, wrqu); 8609 /* TODO: We should use semaphores or locks for access to priv */
5684 return -EOPNOTSUPP; 8610 struct ipw_priv *priv = ieee80211_priv(dev);
8611 u32 target_rate = wrqu->bitrate.value;
8612 u32 fixed, mask;
8613
8614 /* value = -1, fixed = 0 means auto only, so we should use all rates offered by AP */
8615 /* value = X, fixed = 1 means only rate X */
8616 /* value = X, fixed = 0 means all rates lower equal X */
8617
8618 if (target_rate == -1) {
8619 fixed = 0;
8620 mask = IEEE80211_DEFAULT_RATES_MASK;
8621 /* Now we should reassociate */
8622 goto apply;
8623 }
8624
8625 mask = 0;
8626 fixed = wrqu->bitrate.fixed;
8627
8628 if (target_rate == 1000000 || !fixed)
8629 mask |= IEEE80211_CCK_RATE_1MB_MASK;
8630 if (target_rate == 1000000)
8631 goto apply;
8632
8633 if (target_rate == 2000000 || !fixed)
8634 mask |= IEEE80211_CCK_RATE_2MB_MASK;
8635 if (target_rate == 2000000)
8636 goto apply;
8637
8638 if (target_rate == 5500000 || !fixed)
8639 mask |= IEEE80211_CCK_RATE_5MB_MASK;
8640 if (target_rate == 5500000)
8641 goto apply;
8642
8643 if (target_rate == 6000000 || !fixed)
8644 mask |= IEEE80211_OFDM_RATE_6MB_MASK;
8645 if (target_rate == 6000000)
8646 goto apply;
8647
8648 if (target_rate == 9000000 || !fixed)
8649 mask |= IEEE80211_OFDM_RATE_9MB_MASK;
8650 if (target_rate == 9000000)
8651 goto apply;
8652
8653 if (target_rate == 11000000 || !fixed)
8654 mask |= IEEE80211_CCK_RATE_11MB_MASK;
8655 if (target_rate == 11000000)
8656 goto apply;
8657
8658 if (target_rate == 12000000 || !fixed)
8659 mask |= IEEE80211_OFDM_RATE_12MB_MASK;
8660 if (target_rate == 12000000)
8661 goto apply;
8662
8663 if (target_rate == 18000000 || !fixed)
8664 mask |= IEEE80211_OFDM_RATE_18MB_MASK;
8665 if (target_rate == 18000000)
8666 goto apply;
8667
8668 if (target_rate == 24000000 || !fixed)
8669 mask |= IEEE80211_OFDM_RATE_24MB_MASK;
8670 if (target_rate == 24000000)
8671 goto apply;
8672
8673 if (target_rate == 36000000 || !fixed)
8674 mask |= IEEE80211_OFDM_RATE_36MB_MASK;
8675 if (target_rate == 36000000)
8676 goto apply;
8677
8678 if (target_rate == 48000000 || !fixed)
8679 mask |= IEEE80211_OFDM_RATE_48MB_MASK;
8680 if (target_rate == 48000000)
8681 goto apply;
8682
8683 if (target_rate == 54000000 || !fixed)
8684 mask |= IEEE80211_OFDM_RATE_54MB_MASK;
8685 if (target_rate == 54000000)
8686 goto apply;
8687
8688 IPW_DEBUG_WX("invalid rate specified, returning error\n");
8689 return -EINVAL;
8690
8691 apply:
8692 IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n",
8693 mask, fixed ? "fixed" : "sub-rates");
8694 down(&priv->sem);
8695 if (mask == IEEE80211_DEFAULT_RATES_MASK) {
8696 priv->config &= ~CFG_FIXED_RATE;
8697 ipw_set_fixed_rate(priv, priv->ieee->mode);
8698 } else
8699 priv->config |= CFG_FIXED_RATE;
8700
8701 if (priv->rates_mask == mask) {
8702 IPW_DEBUG_WX("Mask set to current mask.\n");
8703 up(&priv->sem);
8704 return 0;
8705 }
8706
8707 priv->rates_mask = mask;
8708
8709 /* Network configuration changed -- force [re]association */
8710 IPW_DEBUG_ASSOC("[re]association triggered due to rates change.\n");
8711 if (!ipw_disassociate(priv))
8712 ipw_associate(priv);
8713
8714 up(&priv->sem);
8715 return 0;
5685} 8716}
5686 8717
5687static int ipw_wx_get_rate(struct net_device *dev, 8718static int ipw_wx_get_rate(struct net_device *dev,
@@ -5689,8 +8720,9 @@ static int ipw_wx_get_rate(struct net_device *dev,
5689 union iwreq_data *wrqu, char *extra) 8720 union iwreq_data *wrqu, char *extra)
5690{ 8721{
5691 struct ipw_priv *priv = ieee80211_priv(dev); 8722 struct ipw_priv *priv = ieee80211_priv(dev);
8723 down(&priv->sem);
5692 wrqu->bitrate.value = priv->last_rate; 8724 wrqu->bitrate.value = priv->last_rate;
5693 8725 up(&priv->sem);
5694 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); 8726 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
5695 return 0; 8727 return 0;
5696} 8728}
@@ -5700,18 +8732,20 @@ static int ipw_wx_set_rts(struct net_device *dev,
5700 union iwreq_data *wrqu, char *extra) 8732 union iwreq_data *wrqu, char *extra)
5701{ 8733{
5702 struct ipw_priv *priv = ieee80211_priv(dev); 8734 struct ipw_priv *priv = ieee80211_priv(dev);
5703 8735 down(&priv->sem);
5704 if (wrqu->rts.disabled) 8736 if (wrqu->rts.disabled)
5705 priv->rts_threshold = DEFAULT_RTS_THRESHOLD; 8737 priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
5706 else { 8738 else {
5707 if (wrqu->rts.value < MIN_RTS_THRESHOLD || 8739 if (wrqu->rts.value < MIN_RTS_THRESHOLD ||
5708 wrqu->rts.value > MAX_RTS_THRESHOLD) 8740 wrqu->rts.value > MAX_RTS_THRESHOLD) {
8741 up(&priv->sem);
5709 return -EINVAL; 8742 return -EINVAL;
5710 8743 }
5711 priv->rts_threshold = wrqu->rts.value; 8744 priv->rts_threshold = wrqu->rts.value;
5712 } 8745 }
5713 8746
5714 ipw_send_rts_threshold(priv, priv->rts_threshold); 8747 ipw_send_rts_threshold(priv, priv->rts_threshold);
8748 up(&priv->sem);
5715 IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold); 8749 IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold);
5716 return 0; 8750 return 0;
5717} 8751}
@@ -5721,10 +8755,11 @@ static int ipw_wx_get_rts(struct net_device *dev,
5721 union iwreq_data *wrqu, char *extra) 8755 union iwreq_data *wrqu, char *extra)
5722{ 8756{
5723 struct ipw_priv *priv = ieee80211_priv(dev); 8757 struct ipw_priv *priv = ieee80211_priv(dev);
8758 down(&priv->sem);
5724 wrqu->rts.value = priv->rts_threshold; 8759 wrqu->rts.value = priv->rts_threshold;
5725 wrqu->rts.fixed = 0; /* no auto select */ 8760 wrqu->rts.fixed = 0; /* no auto select */
5726 wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); 8761 wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);
5727 8762 up(&priv->sem);
5728 IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value); 8763 IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value);
5729 return 0; 8764 return 0;
5730} 8765}
@@ -5734,41 +8769,33 @@ static int ipw_wx_set_txpow(struct net_device *dev,
5734 union iwreq_data *wrqu, char *extra) 8769 union iwreq_data *wrqu, char *extra)
5735{ 8770{
5736 struct ipw_priv *priv = ieee80211_priv(dev); 8771 struct ipw_priv *priv = ieee80211_priv(dev);
5737 struct ipw_tx_power tx_power; 8772 int err = 0;
5738 int i;
5739
5740 if (ipw_radio_kill_sw(priv, wrqu->power.disabled))
5741 return -EINPROGRESS;
5742
5743 if (wrqu->power.flags != IW_TXPOW_DBM)
5744 return -EINVAL;
5745 8773
5746 if ((wrqu->power.value > 20) || (wrqu->power.value < -12)) 8774 down(&priv->sem);
5747 return -EINVAL; 8775 if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) {
8776 err = -EINPROGRESS;
8777 goto out;
8778 }
5748 8779
5749 priv->tx_power = wrqu->power.value; 8780 if (!wrqu->power.fixed)
8781 wrqu->power.value = IPW_TX_POWER_DEFAULT;
5750 8782
5751 memset(&tx_power, 0, sizeof(tx_power)); 8783 if (wrqu->power.flags != IW_TXPOW_DBM) {
5752 8784 err = -EINVAL;
5753 /* configure device for 'G' band */ 8785 goto out;
5754 tx_power.ieee_mode = IPW_G_MODE;
5755 tx_power.num_channels = 11;
5756 for (i = 0; i < 11; i++) {
5757 tx_power.channels_tx_power[i].channel_number = i + 1;
5758 tx_power.channels_tx_power[i].tx_power = priv->tx_power;
5759 } 8786 }
5760 if (ipw_send_tx_power(priv, &tx_power))
5761 goto error;
5762 8787
5763 /* configure device to also handle 'B' band */ 8788 if ((wrqu->power.value > IPW_TX_POWER_MAX) ||
5764 tx_power.ieee_mode = IPW_B_MODE; 8789 (wrqu->power.value < IPW_TX_POWER_MIN)) {
5765 if (ipw_send_tx_power(priv, &tx_power)) 8790 err = -EINVAL;
5766 goto error; 8791 goto out;
5767 8792 }
5768 return 0;
5769 8793
5770 error: 8794 priv->tx_power = wrqu->power.value;
5771 return -EIO; 8795 err = ipw_set_tx_power(priv);
8796 out:
8797 up(&priv->sem);
8798 return err;
5772} 8799}
5773 8800
5774static int ipw_wx_get_txpow(struct net_device *dev, 8801static int ipw_wx_get_txpow(struct net_device *dev,
@@ -5776,14 +8803,15 @@ static int ipw_wx_get_txpow(struct net_device *dev,
5776 union iwreq_data *wrqu, char *extra) 8803 union iwreq_data *wrqu, char *extra)
5777{ 8804{
5778 struct ipw_priv *priv = ieee80211_priv(dev); 8805 struct ipw_priv *priv = ieee80211_priv(dev);
5779 8806 down(&priv->sem);
5780 wrqu->power.value = priv->tx_power; 8807 wrqu->power.value = priv->tx_power;
5781 wrqu->power.fixed = 1; 8808 wrqu->power.fixed = 1;
5782 wrqu->power.flags = IW_TXPOW_DBM; 8809 wrqu->power.flags = IW_TXPOW_DBM;
5783 wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; 8810 wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
8811 up(&priv->sem);
5784 8812
5785 IPW_DEBUG_WX("GET TX Power -> %s %d \n", 8813 IPW_DEBUG_WX("GET TX Power -> %s %d \n",
5786 wrqu->power.disabled ? "ON" : "OFF", wrqu->power.value); 8814 wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value);
5787 8815
5788 return 0; 8816 return 0;
5789} 8817}
@@ -5793,18 +8821,21 @@ static int ipw_wx_set_frag(struct net_device *dev,
5793 union iwreq_data *wrqu, char *extra) 8821 union iwreq_data *wrqu, char *extra)
5794{ 8822{
5795 struct ipw_priv *priv = ieee80211_priv(dev); 8823 struct ipw_priv *priv = ieee80211_priv(dev);
5796 8824 down(&priv->sem);
5797 if (wrqu->frag.disabled) 8825 if (wrqu->frag.disabled)
5798 priv->ieee->fts = DEFAULT_FTS; 8826 priv->ieee->fts = DEFAULT_FTS;
5799 else { 8827 else {
5800 if (wrqu->frag.value < MIN_FRAG_THRESHOLD || 8828 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
5801 wrqu->frag.value > MAX_FRAG_THRESHOLD) 8829 wrqu->frag.value > MAX_FRAG_THRESHOLD) {
8830 up(&priv->sem);
5802 return -EINVAL; 8831 return -EINVAL;
8832 }
5803 8833
5804 priv->ieee->fts = wrqu->frag.value & ~0x1; 8834 priv->ieee->fts = wrqu->frag.value & ~0x1;
5805 } 8835 }
5806 8836
5807 ipw_send_frag_threshold(priv, wrqu->frag.value); 8837 ipw_send_frag_threshold(priv, wrqu->frag.value);
8838 up(&priv->sem);
5808 IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value); 8839 IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value);
5809 return 0; 8840 return 0;
5810} 8841}
@@ -5814,10 +8845,11 @@ static int ipw_wx_get_frag(struct net_device *dev,
5814 union iwreq_data *wrqu, char *extra) 8845 union iwreq_data *wrqu, char *extra)
5815{ 8846{
5816 struct ipw_priv *priv = ieee80211_priv(dev); 8847 struct ipw_priv *priv = ieee80211_priv(dev);
8848 down(&priv->sem);
5817 wrqu->frag.value = priv->ieee->fts; 8849 wrqu->frag.value = priv->ieee->fts;
5818 wrqu->frag.fixed = 0; /* no auto select */ 8850 wrqu->frag.fixed = 0; /* no auto select */
5819 wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS); 8851 wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS);
5820 8852 up(&priv->sem);
5821 IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value); 8853 IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value);
5822 8854
5823 return 0; 8855 return 0;
@@ -5827,16 +8859,128 @@ static int ipw_wx_set_retry(struct net_device *dev,
5827 struct iw_request_info *info, 8859 struct iw_request_info *info,
5828 union iwreq_data *wrqu, char *extra) 8860 union iwreq_data *wrqu, char *extra)
5829{ 8861{
5830 IPW_DEBUG_WX("0x%p, 0x%p, 0x%p\n", dev, info, wrqu); 8862 struct ipw_priv *priv = ieee80211_priv(dev);
5831 return -EOPNOTSUPP; 8863
8864 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
8865 return -EINVAL;
8866
8867 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
8868 return 0;
8869
8870 if (wrqu->retry.value < 0 || wrqu->retry.value > 255)
8871 return -EINVAL;
8872
8873 down(&priv->sem);
8874 if (wrqu->retry.flags & IW_RETRY_MIN)
8875 priv->short_retry_limit = (u8) wrqu->retry.value;
8876 else if (wrqu->retry.flags & IW_RETRY_MAX)
8877 priv->long_retry_limit = (u8) wrqu->retry.value;
8878 else {
8879 priv->short_retry_limit = (u8) wrqu->retry.value;
8880 priv->long_retry_limit = (u8) wrqu->retry.value;
8881 }
8882
8883 ipw_send_retry_limit(priv, priv->short_retry_limit,
8884 priv->long_retry_limit);
8885 up(&priv->sem);
8886 IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n",
8887 priv->short_retry_limit, priv->long_retry_limit);
8888 return 0;
5832} 8889}
5833 8890
5834static int ipw_wx_get_retry(struct net_device *dev, 8891static int ipw_wx_get_retry(struct net_device *dev,
5835 struct iw_request_info *info, 8892 struct iw_request_info *info,
5836 union iwreq_data *wrqu, char *extra) 8893 union iwreq_data *wrqu, char *extra)
5837{ 8894{
5838 IPW_DEBUG_WX("0x%p, 0x%p, 0x%p\n", dev, info, wrqu); 8895 struct ipw_priv *priv = ieee80211_priv(dev);
5839 return -EOPNOTSUPP; 8896
8897 down(&priv->sem);
8898 wrqu->retry.disabled = 0;
8899
8900 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {
8901 up(&priv->sem);
8902 return -EINVAL;
8903 }
8904
8905 if (wrqu->retry.flags & IW_RETRY_MAX) {
8906 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
8907 wrqu->retry.value = priv->long_retry_limit;
8908 } else if (wrqu->retry.flags & IW_RETRY_MIN) {
8909 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN;
8910 wrqu->retry.value = priv->short_retry_limit;
8911 } else {
8912 wrqu->retry.flags = IW_RETRY_LIMIT;
8913 wrqu->retry.value = priv->short_retry_limit;
8914 }
8915 up(&priv->sem);
8916
8917 IPW_DEBUG_WX("GET retry -> %d \n", wrqu->retry.value);
8918
8919 return 0;
8920}
8921
8922static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid,
8923 int essid_len)
8924{
8925 struct ipw_scan_request_ext scan;
8926 int err = 0, scan_type;
8927
8928 down(&priv->sem);
8929
8930 if (priv->status & STATUS_RF_KILL_MASK) {
8931 IPW_DEBUG_HC("Aborting scan due to RF kill activation\n");
8932 priv->status |= STATUS_SCAN_PENDING;
8933 goto done;
8934 }
8935
8936 IPW_DEBUG_HC("starting request direct scan!\n");
8937
8938 if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) {
8939 err = wait_event_interruptible(priv->wait_state,
8940 !(priv->
8941 status & (STATUS_SCANNING |
8942 STATUS_SCAN_ABORTING)));
8943 if (err) {
8944 IPW_DEBUG_HC("aborting direct scan");
8945 goto done;
8946 }
8947 }
8948 memset(&scan, 0, sizeof(scan));
8949
8950 if (priv->config & CFG_SPEED_SCAN)
8951 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
8952 cpu_to_le16(30);
8953 else
8954 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
8955 cpu_to_le16(20);
8956
8957 scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
8958 cpu_to_le16(20);
8959 scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
8960 scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20);
8961
8962 scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
8963
8964 err = ipw_send_ssid(priv, essid, essid_len);
8965 if (err) {
8966 IPW_DEBUG_HC("Attempt to send SSID command failed\n");
8967 goto done;
8968 }
8969 scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN;
8970
8971 ipw_add_scan_channels(priv, &scan, scan_type);
8972
8973 err = ipw_send_scan_request_ext(priv, &scan);
8974 if (err) {
8975 IPW_DEBUG_HC("Sending scan command failed: %08X\n", err);
8976 goto done;
8977 }
8978
8979 priv->status |= STATUS_SCANNING;
8980
8981 done:
8982 up(&priv->sem);
8983 return err;
5840} 8984}
5841 8985
5842static int ipw_wx_set_scan(struct net_device *dev, 8986static int ipw_wx_set_scan(struct net_device *dev,
@@ -5844,9 +8988,21 @@ static int ipw_wx_set_scan(struct net_device *dev,
5844 union iwreq_data *wrqu, char *extra) 8988 union iwreq_data *wrqu, char *extra)
5845{ 8989{
5846 struct ipw_priv *priv = ieee80211_priv(dev); 8990 struct ipw_priv *priv = ieee80211_priv(dev);
8991 struct iw_scan_req *req = NULL;
8992 if (wrqu->data.length
8993 && wrqu->data.length == sizeof(struct iw_scan_req)) {
8994 req = (struct iw_scan_req *)extra;
8995 if (wrqu->data.flags & IW_SCAN_THIS_ESSID) {
8996 ipw_request_direct_scan(priv, req->essid,
8997 req->essid_len);
8998 return 0;
8999 }
9000 }
9001
5847 IPW_DEBUG_WX("Start scan\n"); 9002 IPW_DEBUG_WX("Start scan\n");
5848 if (ipw_request_scan(priv)) 9003
5849 return -EIO; 9004 queue_work(priv->workqueue, &priv->request_scan);
9005
5850 return 0; 9006 return 0;
5851} 9007}
5852 9008
@@ -5863,7 +9019,21 @@ static int ipw_wx_set_encode(struct net_device *dev,
5863 union iwreq_data *wrqu, char *key) 9019 union iwreq_data *wrqu, char *key)
5864{ 9020{
5865 struct ipw_priv *priv = ieee80211_priv(dev); 9021 struct ipw_priv *priv = ieee80211_priv(dev);
5866 return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key); 9022 int ret;
9023 u32 cap = priv->capability;
9024
9025 down(&priv->sem);
9026 ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
9027
9028 /* In IBSS mode, we need to notify the firmware to update
9029 * the beacon info after we changed the capability. */
9030 if (cap != priv->capability &&
9031 priv->ieee->iw_mode == IW_MODE_ADHOC &&
9032 priv->status & STATUS_ASSOCIATED)
9033 ipw_disassociate(priv);
9034
9035 up(&priv->sem);
9036 return ret;
5867} 9037}
5868 9038
5869static int ipw_wx_get_encode(struct net_device *dev, 9039static int ipw_wx_get_encode(struct net_device *dev,
@@ -5880,17 +9050,17 @@ static int ipw_wx_set_power(struct net_device *dev,
5880{ 9050{
5881 struct ipw_priv *priv = ieee80211_priv(dev); 9051 struct ipw_priv *priv = ieee80211_priv(dev);
5882 int err; 9052 int err;
5883 9053 down(&priv->sem);
5884 if (wrqu->power.disabled) { 9054 if (wrqu->power.disabled) {
5885 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); 9055 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
5886 err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM); 9056 err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM);
5887 if (err) { 9057 if (err) {
5888 IPW_DEBUG_WX("failed setting power mode.\n"); 9058 IPW_DEBUG_WX("failed setting power mode.\n");
9059 up(&priv->sem);
5889 return err; 9060 return err;
5890 } 9061 }
5891
5892 IPW_DEBUG_WX("SET Power Management Mode -> off\n"); 9062 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
5893 9063 up(&priv->sem);
5894 return 0; 9064 return 0;
5895 } 9065 }
5896 9066
@@ -5902,6 +9072,7 @@ static int ipw_wx_set_power(struct net_device *dev,
5902 default: /* Otherwise we don't support it */ 9072 default: /* Otherwise we don't support it */
5903 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n", 9073 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
5904 wrqu->power.flags); 9074 wrqu->power.flags);
9075 up(&priv->sem);
5905 return -EOPNOTSUPP; 9076 return -EOPNOTSUPP;
5906 } 9077 }
5907 9078
@@ -5914,11 +9085,12 @@ static int ipw_wx_set_power(struct net_device *dev,
5914 err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); 9085 err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
5915 if (err) { 9086 if (err) {
5916 IPW_DEBUG_WX("failed setting power mode.\n"); 9087 IPW_DEBUG_WX("failed setting power mode.\n");
9088 up(&priv->sem);
5917 return err; 9089 return err;
5918 } 9090 }
5919 9091
5920 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); 9092 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
5921 9093 up(&priv->sem);
5922 return 0; 9094 return 0;
5923} 9095}
5924 9096
@@ -5927,13 +9099,13 @@ static int ipw_wx_get_power(struct net_device *dev,
5927 union iwreq_data *wrqu, char *extra) 9099 union iwreq_data *wrqu, char *extra)
5928{ 9100{
5929 struct ipw_priv *priv = ieee80211_priv(dev); 9101 struct ipw_priv *priv = ieee80211_priv(dev);
5930 9102 down(&priv->sem);
5931 if (!(priv->power_mode & IPW_POWER_ENABLED)) { 9103 if (!(priv->power_mode & IPW_POWER_ENABLED))
5932 wrqu->power.disabled = 1; 9104 wrqu->power.disabled = 1;
5933 } else { 9105 else
5934 wrqu->power.disabled = 0; 9106 wrqu->power.disabled = 0;
5935 }
5936 9107
9108 up(&priv->sem);
5937 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); 9109 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
5938 9110
5939 return 0; 9111 return 0;
@@ -5946,7 +9118,7 @@ static int ipw_wx_set_powermode(struct net_device *dev,
5946 struct ipw_priv *priv = ieee80211_priv(dev); 9118 struct ipw_priv *priv = ieee80211_priv(dev);
5947 int mode = *(int *)extra; 9119 int mode = *(int *)extra;
5948 int err; 9120 int err;
5949 9121 down(&priv->sem);
5950 if ((mode < 1) || (mode > IPW_POWER_LIMIT)) { 9122 if ((mode < 1) || (mode > IPW_POWER_LIMIT)) {
5951 mode = IPW_POWER_AC; 9123 mode = IPW_POWER_AC;
5952 priv->power_mode = mode; 9124 priv->power_mode = mode;
@@ -5959,10 +9131,11 @@ static int ipw_wx_set_powermode(struct net_device *dev,
5959 9131
5960 if (err) { 9132 if (err) {
5961 IPW_DEBUG_WX("failed setting power mode.\n"); 9133 IPW_DEBUG_WX("failed setting power mode.\n");
9134 up(&priv->sem);
5962 return err; 9135 return err;
5963 } 9136 }
5964 } 9137 }
5965 9138 up(&priv->sem);
5966 return 0; 9139 return 0;
5967} 9140}
5968 9141
@@ -6011,7 +9184,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev,
6011 IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode); 9184 IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode);
6012 return -EINVAL; 9185 return -EINVAL;
6013 } 9186 }
6014 9187 down(&priv->sem);
6015 if (priv->adapter == IPW_2915ABG) { 9188 if (priv->adapter == IPW_2915ABG) {
6016 priv->ieee->abg_true = 1; 9189 priv->ieee->abg_true = 1;
6017 if (mode & IEEE_A) { 9190 if (mode & IEEE_A) {
@@ -6023,6 +9196,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev,
6023 if (mode & IEEE_A) { 9196 if (mode & IEEE_A) {
6024 IPW_WARNING("Attempt to set 2200BG into " 9197 IPW_WARNING("Attempt to set 2200BG into "
6025 "802.11a mode\n"); 9198 "802.11a mode\n");
9199 up(&priv->sem);
6026 return -EINVAL; 9200 return -EINVAL;
6027 } 9201 }
6028 9202
@@ -6046,20 +9220,20 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev,
6046 priv->ieee->modulation = modulation; 9220 priv->ieee->modulation = modulation;
6047 init_supported_rates(priv, &priv->rates); 9221 init_supported_rates(priv, &priv->rates);
6048 9222
6049 /* If we are currently associated, or trying to associate 9223 /* Network configuration changed -- force [re]association */
6050 * then see if this is a new configuration (causing us to 9224 IPW_DEBUG_ASSOC("[re]association triggered due to mode change.\n");
6051 * disassociate) */ 9225 if (!ipw_disassociate(priv)) {
6052 if (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) {
6053 /* The resulting association will trigger
6054 * the new rates to be sent to the device */
6055 IPW_DEBUG_ASSOC("Disassociating due to mode change.\n");
6056 ipw_disassociate(priv);
6057 } else
6058 ipw_send_supported_rates(priv, &priv->rates); 9226 ipw_send_supported_rates(priv, &priv->rates);
9227 ipw_associate(priv);
9228 }
9229
9230 /* Update the band LEDs */
9231 ipw_led_band_on(priv);
6059 9232
6060 IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n", 9233 IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n",
6061 mode & IEEE_A ? 'a' : '.', 9234 mode & IEEE_A ? 'a' : '.',
6062 mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.'); 9235 mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.');
9236 up(&priv->sem);
6063 return 0; 9237 return 0;
6064} 9238}
6065 9239
@@ -6068,124 +9242,234 @@ static int ipw_wx_get_wireless_mode(struct net_device *dev,
6068 union iwreq_data *wrqu, char *extra) 9242 union iwreq_data *wrqu, char *extra)
6069{ 9243{
6070 struct ipw_priv *priv = ieee80211_priv(dev); 9244 struct ipw_priv *priv = ieee80211_priv(dev);
6071 9245 down(&priv->sem);
6072 switch (priv->ieee->freq_band) { 9246 switch (priv->ieee->mode) {
6073 case IEEE80211_24GHZ_BAND: 9247 case IEEE_A:
6074 switch (priv->ieee->modulation) {
6075 case IEEE80211_CCK_MODULATION:
6076 strncpy(extra, "802.11b (2)", MAX_WX_STRING);
6077 break;
6078 case IEEE80211_OFDM_MODULATION:
6079 strncpy(extra, "802.11g (4)", MAX_WX_STRING);
6080 break;
6081 default:
6082 strncpy(extra, "802.11bg (6)", MAX_WX_STRING);
6083 break;
6084 }
6085 break;
6086
6087 case IEEE80211_52GHZ_BAND:
6088 strncpy(extra, "802.11a (1)", MAX_WX_STRING); 9248 strncpy(extra, "802.11a (1)", MAX_WX_STRING);
6089 break; 9249 break;
6090 9250 case IEEE_B:
6091 default: /* Mixed Band */ 9251 strncpy(extra, "802.11b (2)", MAX_WX_STRING);
6092 switch (priv->ieee->modulation) { 9252 break;
6093 case IEEE80211_CCK_MODULATION: 9253 case IEEE_A | IEEE_B:
6094 strncpy(extra, "802.11ab (3)", MAX_WX_STRING); 9254 strncpy(extra, "802.11ab (3)", MAX_WX_STRING);
6095 break; 9255 break;
6096 case IEEE80211_OFDM_MODULATION: 9256 case IEEE_G:
6097 strncpy(extra, "802.11ag (5)", MAX_WX_STRING); 9257 strncpy(extra, "802.11g (4)", MAX_WX_STRING);
6098 break; 9258 break;
6099 default: 9259 case IEEE_A | IEEE_G:
6100 strncpy(extra, "802.11abg (7)", MAX_WX_STRING); 9260 strncpy(extra, "802.11ag (5)", MAX_WX_STRING);
6101 break; 9261 break;
6102 } 9262 case IEEE_B | IEEE_G:
9263 strncpy(extra, "802.11bg (6)", MAX_WX_STRING);
9264 break;
9265 case IEEE_A | IEEE_B | IEEE_G:
9266 strncpy(extra, "802.11abg (7)", MAX_WX_STRING);
9267 break;
9268 default:
9269 strncpy(extra, "unknown", MAX_WX_STRING);
6103 break; 9270 break;
6104 } 9271 }
6105 9272
6106 IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra); 9273 IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra);
6107 9274
6108 wrqu->data.length = strlen(extra) + 1; 9275 wrqu->data.length = strlen(extra) + 1;
9276 up(&priv->sem);
6109 9277
6110 return 0; 9278 return 0;
6111} 9279}
6112 9280
6113#ifdef CONFIG_IPW_PROMISC 9281static int ipw_wx_set_preamble(struct net_device *dev,
6114static int ipw_wx_set_promisc(struct net_device *dev, 9282 struct iw_request_info *info,
9283 union iwreq_data *wrqu, char *extra)
9284{
9285 struct ipw_priv *priv = ieee80211_priv(dev);
9286 int mode = *(int *)extra;
9287 down(&priv->sem);
9288 /* Switching from SHORT -> LONG requires a disassociation */
9289 if (mode == 1) {
9290 if (!(priv->config & CFG_PREAMBLE_LONG)) {
9291 priv->config |= CFG_PREAMBLE_LONG;
9292
9293 /* Network configuration changed -- force [re]association */
9294 IPW_DEBUG_ASSOC
9295 ("[re]association triggered due to preamble change.\n");
9296 if (!ipw_disassociate(priv))
9297 ipw_associate(priv);
9298 }
9299 goto done;
9300 }
9301
9302 if (mode == 0) {
9303 priv->config &= ~CFG_PREAMBLE_LONG;
9304 goto done;
9305 }
9306 up(&priv->sem);
9307 return -EINVAL;
9308
9309 done:
9310 up(&priv->sem);
9311 return 0;
9312}
9313
9314static int ipw_wx_get_preamble(struct net_device *dev,
9315 struct iw_request_info *info,
9316 union iwreq_data *wrqu, char *extra)
9317{
9318 struct ipw_priv *priv = ieee80211_priv(dev);
9319 down(&priv->sem);
9320 if (priv->config & CFG_PREAMBLE_LONG)
9321 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
9322 else
9323 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
9324 up(&priv->sem);
9325 return 0;
9326}
9327
9328#ifdef CONFIG_IPW2200_MONITOR
9329static int ipw_wx_set_monitor(struct net_device *dev,
6115 struct iw_request_info *info, 9330 struct iw_request_info *info,
6116 union iwreq_data *wrqu, char *extra) 9331 union iwreq_data *wrqu, char *extra)
6117{ 9332{
6118 struct ipw_priv *priv = ieee80211_priv(dev); 9333 struct ipw_priv *priv = ieee80211_priv(dev);
6119 int *parms = (int *)extra; 9334 int *parms = (int *)extra;
6120 int enable = (parms[0] > 0); 9335 int enable = (parms[0] > 0);
6121 9336 down(&priv->sem);
6122 IPW_DEBUG_WX("SET PROMISC: %d %d\n", enable, parms[1]); 9337 IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]);
6123 if (enable) { 9338 if (enable) {
6124 if (priv->ieee->iw_mode != IW_MODE_MONITOR) { 9339 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
9340#ifdef CONFIG_IEEE80211_RADIOTAP
9341 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
9342#else
6125 priv->net_dev->type = ARPHRD_IEEE80211; 9343 priv->net_dev->type = ARPHRD_IEEE80211;
6126 ipw_adapter_restart(priv); 9344#endif
9345 queue_work(priv->workqueue, &priv->adapter_restart);
6127 } 9346 }
6128 9347
6129 ipw_set_channel(priv, parms[1]); 9348 ipw_set_channel(priv, parms[1]);
6130 } else { 9349 } else {
6131 if (priv->ieee->iw_mode != IW_MODE_MONITOR) 9350 if (priv->ieee->iw_mode != IW_MODE_MONITOR) {
9351 up(&priv->sem);
6132 return 0; 9352 return 0;
9353 }
6133 priv->net_dev->type = ARPHRD_ETHER; 9354 priv->net_dev->type = ARPHRD_ETHER;
6134 ipw_adapter_restart(priv); 9355 queue_work(priv->workqueue, &priv->adapter_restart);
6135 } 9356 }
9357 up(&priv->sem);
6136 return 0; 9358 return 0;
6137} 9359}
6138 9360
9361#endif // CONFIG_IPW2200_MONITOR
9362
6139static int ipw_wx_reset(struct net_device *dev, 9363static int ipw_wx_reset(struct net_device *dev,
6140 struct iw_request_info *info, 9364 struct iw_request_info *info,
6141 union iwreq_data *wrqu, char *extra) 9365 union iwreq_data *wrqu, char *extra)
6142{ 9366{
6143 struct ipw_priv *priv = ieee80211_priv(dev); 9367 struct ipw_priv *priv = ieee80211_priv(dev);
6144 IPW_DEBUG_WX("RESET\n"); 9368 IPW_DEBUG_WX("RESET\n");
6145 ipw_adapter_restart(priv); 9369 queue_work(priv->workqueue, &priv->adapter_restart);
9370 return 0;
9371}
9372
9373static int ipw_wx_sw_reset(struct net_device *dev,
9374 struct iw_request_info *info,
9375 union iwreq_data *wrqu, char *extra)
9376{
9377 struct ipw_priv *priv = ieee80211_priv(dev);
9378 union iwreq_data wrqu_sec = {
9379 .encoding = {
9380 .flags = IW_ENCODE_DISABLED,
9381 },
9382 };
9383 int ret;
9384
9385 IPW_DEBUG_WX("SW_RESET\n");
9386
9387 down(&priv->sem);
9388
9389 ret = ipw_sw_reset(priv, 0);
9390 if (!ret) {
9391 free_firmware();
9392 ipw_adapter_restart(priv);
9393 }
9394
9395 /* The SW reset bit might have been toggled on by the 'disable'
9396 * module parameter, so take appropriate action */
9397 ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW);
9398
9399 up(&priv->sem);
9400 ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL);
9401 down(&priv->sem);
9402
9403 if (!(priv->status & STATUS_RF_KILL_MASK)) {
9404 /* Configuration likely changed -- force [re]association */
9405 IPW_DEBUG_ASSOC("[re]association triggered due to sw "
9406 "reset.\n");
9407 if (!ipw_disassociate(priv))
9408 ipw_associate(priv);
9409 }
9410
9411 up(&priv->sem);
9412
6146 return 0; 9413 return 0;
6147} 9414}
6148#endif // CONFIG_IPW_PROMISC
6149 9415
6150/* Rebase the WE IOCTLs to zero for the handler array */ 9416/* Rebase the WE IOCTLs to zero for the handler array */
6151#define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] 9417#define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT]
6152static iw_handler ipw_wx_handlers[] = { 9418static iw_handler ipw_wx_handlers[] = {
6153 IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name, 9419 IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name,
6154 IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq, 9420 IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq,
6155 IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, 9421 IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq,
6156 IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, 9422 IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode,
6157 IW_IOCTL(SIOCGIWMODE) = ipw_wx_get_mode, 9423 IW_IOCTL(SIOCGIWMODE) = ipw_wx_get_mode,
6158 IW_IOCTL(SIOCGIWRANGE) = ipw_wx_get_range, 9424 IW_IOCTL(SIOCGIWRANGE) = ipw_wx_get_range,
6159 IW_IOCTL(SIOCSIWAP) = ipw_wx_set_wap, 9425 IW_IOCTL(SIOCSIWAP) = ipw_wx_set_wap,
6160 IW_IOCTL(SIOCGIWAP) = ipw_wx_get_wap, 9426 IW_IOCTL(SIOCGIWAP) = ipw_wx_get_wap,
6161 IW_IOCTL(SIOCSIWSCAN) = ipw_wx_set_scan, 9427 IW_IOCTL(SIOCSIWSCAN) = ipw_wx_set_scan,
6162 IW_IOCTL(SIOCGIWSCAN) = ipw_wx_get_scan, 9428 IW_IOCTL(SIOCGIWSCAN) = ipw_wx_get_scan,
6163 IW_IOCTL(SIOCSIWESSID) = ipw_wx_set_essid, 9429 IW_IOCTL(SIOCSIWESSID) = ipw_wx_set_essid,
6164 IW_IOCTL(SIOCGIWESSID) = ipw_wx_get_essid, 9430 IW_IOCTL(SIOCGIWESSID) = ipw_wx_get_essid,
6165 IW_IOCTL(SIOCSIWNICKN) = ipw_wx_set_nick, 9431 IW_IOCTL(SIOCSIWNICKN) = ipw_wx_set_nick,
6166 IW_IOCTL(SIOCGIWNICKN) = ipw_wx_get_nick, 9432 IW_IOCTL(SIOCGIWNICKN) = ipw_wx_get_nick,
6167 IW_IOCTL(SIOCSIWRATE) = ipw_wx_set_rate, 9433 IW_IOCTL(SIOCSIWRATE) = ipw_wx_set_rate,
6168 IW_IOCTL(SIOCGIWRATE) = ipw_wx_get_rate, 9434 IW_IOCTL(SIOCGIWRATE) = ipw_wx_get_rate,
6169 IW_IOCTL(SIOCSIWRTS) = ipw_wx_set_rts, 9435 IW_IOCTL(SIOCSIWRTS) = ipw_wx_set_rts,
6170 IW_IOCTL(SIOCGIWRTS) = ipw_wx_get_rts, 9436 IW_IOCTL(SIOCGIWRTS) = ipw_wx_get_rts,
6171 IW_IOCTL(SIOCSIWFRAG) = ipw_wx_set_frag, 9437 IW_IOCTL(SIOCSIWFRAG) = ipw_wx_set_frag,
6172 IW_IOCTL(SIOCGIWFRAG) = ipw_wx_get_frag, 9438 IW_IOCTL(SIOCGIWFRAG) = ipw_wx_get_frag,
6173 IW_IOCTL(SIOCSIWTXPOW) = ipw_wx_set_txpow, 9439 IW_IOCTL(SIOCSIWTXPOW) = ipw_wx_set_txpow,
6174 IW_IOCTL(SIOCGIWTXPOW) = ipw_wx_get_txpow, 9440 IW_IOCTL(SIOCGIWTXPOW) = ipw_wx_get_txpow,
6175 IW_IOCTL(SIOCSIWRETRY) = ipw_wx_set_retry, 9441 IW_IOCTL(SIOCSIWRETRY) = ipw_wx_set_retry,
6176 IW_IOCTL(SIOCGIWRETRY) = ipw_wx_get_retry, 9442 IW_IOCTL(SIOCGIWRETRY) = ipw_wx_get_retry,
6177 IW_IOCTL(SIOCSIWENCODE) = ipw_wx_set_encode, 9443 IW_IOCTL(SIOCSIWENCODE) = ipw_wx_set_encode,
6178 IW_IOCTL(SIOCGIWENCODE) = ipw_wx_get_encode, 9444 IW_IOCTL(SIOCGIWENCODE) = ipw_wx_get_encode,
6179 IW_IOCTL(SIOCSIWPOWER) = ipw_wx_set_power, 9445 IW_IOCTL(SIOCSIWPOWER) = ipw_wx_set_power,
6180 IW_IOCTL(SIOCGIWPOWER) = ipw_wx_get_power, 9446 IW_IOCTL(SIOCGIWPOWER) = ipw_wx_get_power,
9447 IW_IOCTL(SIOCSIWSPY) = iw_handler_set_spy,
9448 IW_IOCTL(SIOCGIWSPY) = iw_handler_get_spy,
9449 IW_IOCTL(SIOCSIWTHRSPY) = iw_handler_set_thrspy,
9450 IW_IOCTL(SIOCGIWTHRSPY) = iw_handler_get_thrspy,
9451 IW_IOCTL(SIOCSIWGENIE) = ipw_wx_set_genie,
9452 IW_IOCTL(SIOCGIWGENIE) = ipw_wx_get_genie,
9453 IW_IOCTL(SIOCSIWMLME) = ipw_wx_set_mlme,
9454 IW_IOCTL(SIOCSIWAUTH) = ipw_wx_set_auth,
9455 IW_IOCTL(SIOCGIWAUTH) = ipw_wx_get_auth,
9456 IW_IOCTL(SIOCSIWENCODEEXT) = ipw_wx_set_encodeext,
9457 IW_IOCTL(SIOCGIWENCODEEXT) = ipw_wx_get_encodeext,
6181}; 9458};
6182 9459
6183#define IPW_PRIV_SET_POWER SIOCIWFIRSTPRIV 9460enum {
6184#define IPW_PRIV_GET_POWER SIOCIWFIRSTPRIV+1 9461 IPW_PRIV_SET_POWER = SIOCIWFIRSTPRIV,
6185#define IPW_PRIV_SET_MODE SIOCIWFIRSTPRIV+2 9462 IPW_PRIV_GET_POWER,
6186#define IPW_PRIV_GET_MODE SIOCIWFIRSTPRIV+3 9463 IPW_PRIV_SET_MODE,
6187#define IPW_PRIV_SET_PROMISC SIOCIWFIRSTPRIV+4 9464 IPW_PRIV_GET_MODE,
6188#define IPW_PRIV_RESET SIOCIWFIRSTPRIV+5 9465 IPW_PRIV_SET_PREAMBLE,
9466 IPW_PRIV_GET_PREAMBLE,
9467 IPW_PRIV_RESET,
9468 IPW_PRIV_SW_RESET,
9469#ifdef CONFIG_IPW2200_MONITOR
9470 IPW_PRIV_SET_MONITOR,
9471#endif
9472};
6189 9473
6190static struct iw_priv_args ipw_priv_args[] = { 9474static struct iw_priv_args ipw_priv_args[] = {
6191 { 9475 {
@@ -6204,14 +9488,25 @@ static struct iw_priv_args ipw_priv_args[] = {
6204 .cmd = IPW_PRIV_GET_MODE, 9488 .cmd = IPW_PRIV_GET_MODE,
6205 .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_WX_STRING, 9489 .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_WX_STRING,
6206 .name = "get_mode"}, 9490 .name = "get_mode"},
6207#ifdef CONFIG_IPW_PROMISC
6208 { 9491 {
6209 IPW_PRIV_SET_PROMISC, 9492 .cmd = IPW_PRIV_SET_PREAMBLE,
6210 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"}, 9493 .set_args = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
9494 .name = "set_preamble"},
9495 {
9496 .cmd = IPW_PRIV_GET_PREAMBLE,
9497 .get_args = IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ,
9498 .name = "get_preamble"},
6211 { 9499 {
6212 IPW_PRIV_RESET, 9500 IPW_PRIV_RESET,
6213 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"}, 9501 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
6214#endif /* CONFIG_IPW_PROMISC */ 9502 {
9503 IPW_PRIV_SW_RESET,
9504 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "sw_reset"},
9505#ifdef CONFIG_IPW2200_MONITOR
9506 {
9507 IPW_PRIV_SET_MONITOR,
9508 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
9509#endif /* CONFIG_IPW2200_MONITOR */
6215}; 9510};
6216 9511
6217static iw_handler ipw_priv_handler[] = { 9512static iw_handler ipw_priv_handler[] = {
@@ -6219,19 +9514,23 @@ static iw_handler ipw_priv_handler[] = {
6219 ipw_wx_get_powermode, 9514 ipw_wx_get_powermode,
6220 ipw_wx_set_wireless_mode, 9515 ipw_wx_set_wireless_mode,
6221 ipw_wx_get_wireless_mode, 9516 ipw_wx_get_wireless_mode,
6222#ifdef CONFIG_IPW_PROMISC 9517 ipw_wx_set_preamble,
6223 ipw_wx_set_promisc, 9518 ipw_wx_get_preamble,
6224 ipw_wx_reset, 9519 ipw_wx_reset,
9520 ipw_wx_sw_reset,
9521#ifdef CONFIG_IPW2200_MONITOR
9522 ipw_wx_set_monitor,
6225#endif 9523#endif
6226}; 9524};
6227 9525
6228static struct iw_handler_def ipw_wx_handler_def = { 9526static struct iw_handler_def ipw_wx_handler_def = {
6229 .standard = ipw_wx_handlers, 9527 .standard = ipw_wx_handlers,
6230 .num_standard = ARRAY_SIZE(ipw_wx_handlers), 9528 .num_standard = ARRAY_SIZE(ipw_wx_handlers),
6231 .num_private = ARRAY_SIZE(ipw_priv_handler), 9529 .num_private = ARRAY_SIZE(ipw_priv_handler),
6232 .num_private_args = ARRAY_SIZE(ipw_priv_args), 9530 .num_private_args = ARRAY_SIZE(ipw_priv_args),
6233 .private = ipw_priv_handler, 9531 .private = ipw_priv_handler,
6234 .private_args = ipw_priv_args, 9532 .private_args = ipw_priv_args,
9533 .get_wireless_stats = ipw_get_wireless_stats,
6235}; 9534};
6236 9535
6237/* 9536/*
@@ -6246,8 +9545,8 @@ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev)
6246 9545
6247 wstats = &priv->wstats; 9546 wstats = &priv->wstats;
6248 9547
6249 /* if hw is disabled, then ipw2100_get_ordinal() can't be called. 9548 /* if hw is disabled, then ipw_get_ordinal() can't be called.
6250 * ipw2100_wx_wireless_stats seems to be called before fw is 9549 * netdev->get_wireless_stats seems to be called before fw is
6251 * initialized. STATUS_ASSOCIATED will only be set if the hw is up 9550 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
6252 * and associated; if not associcated, the values are all meaningless 9551 * and associated; if not associcated, the values are all meaningless
6253 * anyway, so set them all to NULL and INVALID */ 9552 * anyway, so set them all to NULL and INVALID */
@@ -6298,7 +9597,7 @@ static inline void init_sys_config(struct ipw_sys_config *sys_config)
6298 sys_config->dot11g_auto_detection = 0; 9597 sys_config->dot11g_auto_detection = 0;
6299 sys_config->enable_cts_to_self = 0; 9598 sys_config->enable_cts_to_self = 0;
6300 sys_config->bt_coexist_collision_thr = 0; 9599 sys_config->bt_coexist_collision_thr = 0;
6301 sys_config->pass_noise_stats_to_host = 1; 9600 sys_config->pass_noise_stats_to_host = 1; //1 -- fix for 256
6302} 9601}
6303 9602
6304static int ipw_net_open(struct net_device *dev) 9603static int ipw_net_open(struct net_device *dev)
@@ -6306,9 +9605,11 @@ static int ipw_net_open(struct net_device *dev)
6306 struct ipw_priv *priv = ieee80211_priv(dev); 9605 struct ipw_priv *priv = ieee80211_priv(dev);
6307 IPW_DEBUG_INFO("dev->open\n"); 9606 IPW_DEBUG_INFO("dev->open\n");
6308 /* we should be verifying the device is ready to be opened */ 9607 /* we should be verifying the device is ready to be opened */
9608 down(&priv->sem);
6309 if (!(priv->status & STATUS_RF_KILL_MASK) && 9609 if (!(priv->status & STATUS_RF_KILL_MASK) &&
6310 (priv->status & STATUS_ASSOCIATED)) 9610 (priv->status & STATUS_ASSOCIATED))
6311 netif_start_queue(dev); 9611 netif_start_queue(dev);
9612 up(&priv->sem);
6312 return 0; 9613 return 0;
6313} 9614}
6314 9615
@@ -6326,22 +9627,34 @@ modify to send one tfd per fragment instead of using chunking. otherwise
6326we need to heavily modify the ieee80211_skb_to_txb. 9627we need to heavily modify the ieee80211_skb_to_txb.
6327*/ 9628*/
6328 9629
6329static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb) 9630static inline int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
9631 int pri)
6330{ 9632{
6331 struct ieee80211_hdr_3addr *hdr = (struct ieee80211_hdr_3addr *) 9633 struct ieee80211_hdr_3addr *hdr = (struct ieee80211_hdr_3addr *)
6332 txb->fragments[0]->data; 9634 txb->fragments[0]->data;
6333 int i = 0; 9635 int i = 0;
6334 struct tfd_frame *tfd; 9636 struct tfd_frame *tfd;
9637#ifdef CONFIG_IPW_QOS
9638 int tx_id = ipw_get_tx_queue_number(priv, pri);
9639 struct clx2_tx_queue *txq = &priv->txq[tx_id];
9640#else
6335 struct clx2_tx_queue *txq = &priv->txq[0]; 9641 struct clx2_tx_queue *txq = &priv->txq[0];
9642#endif
6336 struct clx2_queue *q = &txq->q; 9643 struct clx2_queue *q = &txq->q;
6337 u8 id, hdr_len, unicast; 9644 u8 id, hdr_len, unicast;
6338 u16 remaining_bytes; 9645 u16 remaining_bytes;
9646 int fc;
9647
9648 /* If there isn't room in the queue, we return busy and let the
9649 * network stack requeue the packet for us */
9650 if (ipw_queue_space(q) < q->high_mark)
9651 return NETDEV_TX_BUSY;
6339 9652
6340 switch (priv->ieee->iw_mode) { 9653 switch (priv->ieee->iw_mode) {
6341 case IW_MODE_ADHOC: 9654 case IW_MODE_ADHOC:
6342 hdr_len = IEEE80211_3ADDR_LEN; 9655 hdr_len = IEEE80211_3ADDR_LEN;
6343 unicast = !is_broadcast_ether_addr(hdr->addr1) && 9656 unicast = !(is_multicast_ether_addr(hdr->addr1) ||
6344 !is_multicast_ether_addr(hdr->addr1); 9657 is_broadcast_ether_addr(hdr->addr1));
6345 id = ipw_find_station(priv, hdr->addr1); 9658 id = ipw_find_station(priv, hdr->addr1);
6346 if (id == IPW_INVALID_STATION) { 9659 if (id == IPW_INVALID_STATION) {
6347 id = ipw_add_station(priv, hdr->addr1); 9660 id = ipw_add_station(priv, hdr->addr1);
@@ -6356,8 +9669,8 @@ static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb)
6356 9669
6357 case IW_MODE_INFRA: 9670 case IW_MODE_INFRA:
6358 default: 9671 default:
6359 unicast = !is_broadcast_ether_addr(hdr->addr3) && 9672 unicast = !(is_multicast_ether_addr(hdr->addr3) ||
6360 !is_multicast_ether_addr(hdr->addr3); 9673 is_broadcast_ether_addr(hdr->addr3));
6361 hdr_len = IEEE80211_3ADDR_LEN; 9674 hdr_len = IEEE80211_3ADDR_LEN;
6362 id = 0; 9675 id = 0;
6363 break; 9676 break;
@@ -6372,26 +9685,83 @@ static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb)
6372 tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK; 9685 tfd->control_flags.control_bits = TFD_NEED_IRQ_MASK;
6373 9686
6374 tfd->u.data.cmd_id = DINO_CMD_TX; 9687 tfd->u.data.cmd_id = DINO_CMD_TX;
6375 tfd->u.data.len = txb->payload_size; 9688 tfd->u.data.len = cpu_to_le16(txb->payload_size);
6376 remaining_bytes = txb->payload_size; 9689 remaining_bytes = txb->payload_size;
6377 if (unlikely(!unicast))
6378 tfd->u.data.tx_flags = DCT_FLAG_NO_WEP;
6379 else
6380 tfd->u.data.tx_flags = DCT_FLAG_NO_WEP | DCT_FLAG_ACK_REQD;
6381 9690
6382 if (priv->assoc_request.ieee_mode == IPW_B_MODE) 9691 if (priv->assoc_request.ieee_mode == IPW_B_MODE)
6383 tfd->u.data.tx_flags_ext = DCT_FLAG_EXT_MODE_CCK; 9692 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_CCK;
6384 else 9693 else
6385 tfd->u.data.tx_flags_ext = DCT_FLAG_EXT_MODE_OFDM; 9694 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_MODE_OFDM;
6386 9695
6387 if (priv->config & CFG_PREAMBLE) 9696 if (priv->assoc_request.preamble_length == DCT_FLAG_SHORT_PREAMBLE)
6388 tfd->u.data.tx_flags |= DCT_FLAG_SHORT_PREMBL; 9697 tfd->u.data.tx_flags |= DCT_FLAG_SHORT_PREAMBLE;
9698
9699 fc = le16_to_cpu(hdr->frame_ctl);
9700 hdr->frame_ctl = cpu_to_le16(fc & ~IEEE80211_FCTL_MOREFRAGS);
6389 9701
6390 memcpy(&tfd->u.data.tfd.tfd_24.mchdr, hdr, hdr_len); 9702 memcpy(&tfd->u.data.tfd.tfd_24.mchdr, hdr, hdr_len);
6391 9703
9704 if (likely(unicast))
9705 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD;
9706
9707 if (txb->encrypted && !priv->ieee->host_encrypt) {
9708 switch (priv->ieee->sec.level) {
9709 case SEC_LEVEL_3:
9710 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
9711 IEEE80211_FCTL_PROTECTED;
9712 /* XXX: ACK flag must be set for CCMP even if it
9713 * is a multicast/broadcast packet, because CCMP
9714 * group communication encrypted by GTK is
9715 * actually done by the AP. */
9716 if (!unicast)
9717 tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD;
9718
9719 tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP;
9720 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_CCM;
9721 tfd->u.data.key_index = 0;
9722 tfd->u.data.key_index |= DCT_WEP_INDEX_USE_IMMEDIATE;
9723 break;
9724 case SEC_LEVEL_2:
9725 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
9726 IEEE80211_FCTL_PROTECTED;
9727 tfd->u.data.tx_flags &= ~DCT_FLAG_NO_WEP;
9728 tfd->u.data.tx_flags_ext |= DCT_FLAG_EXT_SECURITY_TKIP;
9729 tfd->u.data.key_index = DCT_WEP_INDEX_USE_IMMEDIATE;
9730 break;
9731 case SEC_LEVEL_1:
9732 tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |=
9733 IEEE80211_FCTL_PROTECTED;
9734 tfd->u.data.key_index = priv->ieee->tx_keyidx;
9735 if (priv->ieee->sec.key_sizes[priv->ieee->tx_keyidx] <=
9736 40)
9737 tfd->u.data.key_index |= DCT_WEP_KEY_64Bit;
9738 else
9739 tfd->u.data.key_index |= DCT_WEP_KEY_128Bit;
9740 break;
9741 case SEC_LEVEL_0:
9742 break;
9743 default:
9744 printk(KERN_ERR "Unknow security level %d\n",
9745 priv->ieee->sec.level);
9746 break;
9747 }
9748 } else
9749 /* No hardware encryption */
9750 tfd->u.data.tx_flags |= DCT_FLAG_NO_WEP;
9751
9752#ifdef CONFIG_IPW_QOS
9753 ipw_qos_set_tx_queue_command(priv, pri, &(tfd->u.data), unicast);
9754#endif /* CONFIG_IPW_QOS */
9755
6392 /* payload */ 9756 /* payload */
6393 tfd->u.data.num_chunks = min((u8) (NUM_TFD_CHUNKS - 2), txb->nr_frags); 9757 tfd->u.data.num_chunks = cpu_to_le32(min((u8) (NUM_TFD_CHUNKS - 2),
6394 for (i = 0; i < tfd->u.data.num_chunks; i++) { 9758 txb->nr_frags));
9759 IPW_DEBUG_FRAG("%i fragments being sent as %i chunks.\n",
9760 txb->nr_frags, le32_to_cpu(tfd->u.data.num_chunks));
9761 for (i = 0; i < le32_to_cpu(tfd->u.data.num_chunks); i++) {
9762 IPW_DEBUG_FRAG("Adding fragment %i of %i (%d bytes).\n",
9763 i, le32_to_cpu(tfd->u.data.num_chunks),
9764 txb->fragments[i]->len - hdr_len);
6395 IPW_DEBUG_TX("Dumping TX packet frag %i of %i (%d bytes):\n", 9765 IPW_DEBUG_TX("Dumping TX packet frag %i of %i (%d bytes):\n",
6396 i, tfd->u.data.num_chunks, 9766 i, tfd->u.data.num_chunks,
6397 txb->fragments[i]->len - hdr_len); 9767 txb->fragments[i]->len - hdr_len);
@@ -6399,11 +9769,13 @@ static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb)
6399 txb->fragments[i]->len - hdr_len); 9769 txb->fragments[i]->len - hdr_len);
6400 9770
6401 tfd->u.data.chunk_ptr[i] = 9771 tfd->u.data.chunk_ptr[i] =
6402 pci_map_single(priv->pci_dev, 9772 cpu_to_le32(pci_map_single
6403 txb->fragments[i]->data + hdr_len, 9773 (priv->pci_dev,
6404 txb->fragments[i]->len - hdr_len, 9774 txb->fragments[i]->data + hdr_len,
6405 PCI_DMA_TODEVICE); 9775 txb->fragments[i]->len - hdr_len,
6406 tfd->u.data.chunk_len[i] = txb->fragments[i]->len - hdr_len; 9776 PCI_DMA_TODEVICE));
9777 tfd->u.data.chunk_len[i] =
9778 cpu_to_le16(txb->fragments[i]->len - hdr_len);
6407 } 9779 }
6408 9780
6409 if (i != txb->nr_frags) { 9781 if (i != txb->nr_frags) {
@@ -6418,9 +9790,10 @@ static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb)
6418 remaining_bytes); 9790 remaining_bytes);
6419 skb = alloc_skb(remaining_bytes, GFP_ATOMIC); 9791 skb = alloc_skb(remaining_bytes, GFP_ATOMIC);
6420 if (skb != NULL) { 9792 if (skb != NULL) {
6421 tfd->u.data.chunk_len[i] = remaining_bytes; 9793 tfd->u.data.chunk_len[i] = cpu_to_le16(remaining_bytes);
6422 for (j = i; j < txb->nr_frags; j++) { 9794 for (j = i; j < txb->nr_frags; j++) {
6423 int size = txb->fragments[j]->len - hdr_len; 9795 int size = txb->fragments[j]->len - hdr_len;
9796
6424 printk(KERN_INFO "Adding frag %d %d...\n", 9797 printk(KERN_INFO "Adding frag %d %d...\n",
6425 j, size); 9798 j, size);
6426 memcpy(skb_put(skb, size), 9799 memcpy(skb_put(skb, size),
@@ -6429,10 +9802,14 @@ static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb)
6429 dev_kfree_skb_any(txb->fragments[i]); 9802 dev_kfree_skb_any(txb->fragments[i]);
6430 txb->fragments[i] = skb; 9803 txb->fragments[i] = skb;
6431 tfd->u.data.chunk_ptr[i] = 9804 tfd->u.data.chunk_ptr[i] =
6432 pci_map_single(priv->pci_dev, skb->data, 9805 cpu_to_le32(pci_map_single
6433 tfd->u.data.chunk_len[i], 9806 (priv->pci_dev, skb->data,
6434 PCI_DMA_TODEVICE); 9807 tfd->u.data.chunk_len[i],
6435 tfd->u.data.num_chunks++; 9808 PCI_DMA_TODEVICE));
9809
9810 tfd->u.data.num_chunks =
9811 cpu_to_le32(le32_to_cpu(tfd->u.data.num_chunks) +
9812 1);
6436 } 9813 }
6437 } 9814 }
6438 9815
@@ -6440,14 +9817,28 @@ static inline void ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb)
6440 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd); 9817 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd);
6441 ipw_write32(priv, q->reg_w, q->first_empty); 9818 ipw_write32(priv, q->reg_w, q->first_empty);
6442 9819
6443 if (ipw_queue_space(q) < q->high_mark) 9820 return NETDEV_TX_OK;
6444 netif_stop_queue(priv->net_dev);
6445
6446 return;
6447 9821
6448 drop: 9822 drop:
6449 IPW_DEBUG_DROP("Silently dropping Tx packet.\n"); 9823 IPW_DEBUG_DROP("Silently dropping Tx packet.\n");
6450 ieee80211_txb_free(txb); 9824 ieee80211_txb_free(txb);
9825 return NETDEV_TX_OK;
9826}
9827
9828static int ipw_net_is_queue_full(struct net_device *dev, int pri)
9829{
9830 struct ipw_priv *priv = ieee80211_priv(dev);
9831#ifdef CONFIG_IPW_QOS
9832 int tx_id = ipw_get_tx_queue_number(priv, pri);
9833 struct clx2_tx_queue *txq = &priv->txq[tx_id];
9834#else
9835 struct clx2_tx_queue *txq = &priv->txq[0];
9836#endif /* CONFIG_IPW_QOS */
9837
9838 if (ipw_queue_space(&txq->q) < txq->q.high_mark)
9839 return 1;
9840
9841 return 0;
6451} 9842}
6452 9843
6453static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb, 9844static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
@@ -6455,9 +9846,9 @@ static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
6455{ 9846{
6456 struct ipw_priv *priv = ieee80211_priv(dev); 9847 struct ipw_priv *priv = ieee80211_priv(dev);
6457 unsigned long flags; 9848 unsigned long flags;
9849 int ret;
6458 9850
6459 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size); 9851 IPW_DEBUG_TX("dev->xmit(%d bytes)\n", txb->payload_size);
6460
6461 spin_lock_irqsave(&priv->lock, flags); 9852 spin_lock_irqsave(&priv->lock, flags);
6462 9853
6463 if (!(priv->status & STATUS_ASSOCIATED)) { 9854 if (!(priv->status & STATUS_ASSOCIATED)) {
@@ -6467,10 +9858,12 @@ static int ipw_net_hard_start_xmit(struct ieee80211_txb *txb,
6467 goto fail_unlock; 9858 goto fail_unlock;
6468 } 9859 }
6469 9860
6470 ipw_tx_skb(priv, txb); 9861 ret = ipw_tx_skb(priv, txb, pri);
6471 9862 if (ret == NETDEV_TX_OK)
9863 __ipw_led_activity_on(priv);
6472 spin_unlock_irqrestore(&priv->lock, flags); 9864 spin_unlock_irqrestore(&priv->lock, flags);
6473 return 0; 9865
9866 return ret;
6474 9867
6475 fail_unlock: 9868 fail_unlock:
6476 spin_unlock_irqrestore(&priv->lock, flags); 9869 spin_unlock_irqrestore(&priv->lock, flags);
@@ -6497,11 +9890,13 @@ static int ipw_net_set_mac_address(struct net_device *dev, void *p)
6497 struct sockaddr *addr = p; 9890 struct sockaddr *addr = p;
6498 if (!is_valid_ether_addr(addr->sa_data)) 9891 if (!is_valid_ether_addr(addr->sa_data))
6499 return -EADDRNOTAVAIL; 9892 return -EADDRNOTAVAIL;
9893 down(&priv->sem);
6500 priv->config |= CFG_CUSTOM_MAC; 9894 priv->config |= CFG_CUSTOM_MAC;
6501 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); 9895 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
6502 printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n", 9896 printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n",
6503 priv->net_dev->name, MAC_ARG(priv->mac_addr)); 9897 priv->net_dev->name, MAC_ARG(priv->mac_addr));
6504 ipw_adapter_restart(priv); 9898 queue_work(priv->workqueue, &priv->adapter_restart);
9899 up(&priv->sem);
6505 return 0; 9900 return 0;
6506} 9901}
6507 9902
@@ -6524,7 +9919,7 @@ static void ipw_ethtool_get_drvinfo(struct net_device *dev,
6524 snprintf(info->fw_version, sizeof(info->fw_version), "%s (%s)", 9919 snprintf(info->fw_version, sizeof(info->fw_version), "%s (%s)",
6525 vers, date); 9920 vers, date);
6526 strcpy(info->bus_info, pci_name(p->pci_dev)); 9921 strcpy(info->bus_info, pci_name(p->pci_dev));
6527 info->eedump_len = CX2_EEPROM_IMAGE_SIZE; 9922 info->eedump_len = IPW_EEPROM_IMAGE_SIZE;
6528} 9923}
6529 9924
6530static u32 ipw_ethtool_get_link(struct net_device *dev) 9925static u32 ipw_ethtool_get_link(struct net_device *dev)
@@ -6535,7 +9930,7 @@ static u32 ipw_ethtool_get_link(struct net_device *dev)
6535 9930
6536static int ipw_ethtool_get_eeprom_len(struct net_device *dev) 9931static int ipw_ethtool_get_eeprom_len(struct net_device *dev)
6537{ 9932{
6538 return CX2_EEPROM_IMAGE_SIZE; 9933 return IPW_EEPROM_IMAGE_SIZE;
6539} 9934}
6540 9935
6541static int ipw_ethtool_get_eeprom(struct net_device *dev, 9936static int ipw_ethtool_get_eeprom(struct net_device *dev,
@@ -6543,10 +9938,11 @@ static int ipw_ethtool_get_eeprom(struct net_device *dev,
6543{ 9938{
6544 struct ipw_priv *p = ieee80211_priv(dev); 9939 struct ipw_priv *p = ieee80211_priv(dev);
6545 9940
6546 if (eeprom->offset + eeprom->len > CX2_EEPROM_IMAGE_SIZE) 9941 if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE)
6547 return -EINVAL; 9942 return -EINVAL;
6548 9943 down(&p->sem);
6549 memcpy(bytes, &((u8 *) p->eeprom)[eeprom->offset], eeprom->len); 9944 memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len);
9945 up(&p->sem);
6550 return 0; 9946 return 0;
6551} 9947}
6552 9948
@@ -6556,23 +9952,23 @@ static int ipw_ethtool_set_eeprom(struct net_device *dev,
6556 struct ipw_priv *p = ieee80211_priv(dev); 9952 struct ipw_priv *p = ieee80211_priv(dev);
6557 int i; 9953 int i;
6558 9954
6559 if (eeprom->offset + eeprom->len > CX2_EEPROM_IMAGE_SIZE) 9955 if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE)
6560 return -EINVAL; 9956 return -EINVAL;
6561 9957 down(&p->sem);
6562 memcpy(&((u8 *) p->eeprom)[eeprom->offset], bytes, eeprom->len); 9958 memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len);
6563 for (i = IPW_EEPROM_DATA; 9959 for (i = IPW_EEPROM_DATA;
6564 i < IPW_EEPROM_DATA + CX2_EEPROM_IMAGE_SIZE; i++) 9960 i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++)
6565 ipw_write8(p, i, p->eeprom[i]); 9961 ipw_write8(p, i, p->eeprom[i]);
6566 9962 up(&p->sem);
6567 return 0; 9963 return 0;
6568} 9964}
6569 9965
6570static struct ethtool_ops ipw_ethtool_ops = { 9966static struct ethtool_ops ipw_ethtool_ops = {
6571 .get_link = ipw_ethtool_get_link, 9967 .get_link = ipw_ethtool_get_link,
6572 .get_drvinfo = ipw_ethtool_get_drvinfo, 9968 .get_drvinfo = ipw_ethtool_get_drvinfo,
6573 .get_eeprom_len = ipw_ethtool_get_eeprom_len, 9969 .get_eeprom_len = ipw_ethtool_get_eeprom_len,
6574 .get_eeprom = ipw_ethtool_get_eeprom, 9970 .get_eeprom = ipw_ethtool_get_eeprom,
6575 .set_eeprom = ipw_ethtool_set_eeprom, 9971 .set_eeprom = ipw_ethtool_set_eeprom,
6576}; 9972};
6577 9973
6578static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs) 9974static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs)
@@ -6590,8 +9986,8 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs)
6590 goto none; 9986 goto none;
6591 } 9987 }
6592 9988
6593 inta = ipw_read32(priv, CX2_INTA_RW); 9989 inta = ipw_read32(priv, IPW_INTA_RW);
6594 inta_mask = ipw_read32(priv, CX2_INTA_MASK_R); 9990 inta_mask = ipw_read32(priv, IPW_INTA_MASK_R);
6595 9991
6596 if (inta == 0xFFFFFFFF) { 9992 if (inta == 0xFFFFFFFF) {
6597 /* Hardware disappeared */ 9993 /* Hardware disappeared */
@@ -6599,7 +9995,7 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs)
6599 goto none; 9995 goto none;
6600 } 9996 }
6601 9997
6602 if (!(inta & (CX2_INTA_MASK_ALL & inta_mask))) { 9998 if (!(inta & (IPW_INTA_MASK_ALL & inta_mask))) {
6603 /* Shared interrupt */ 9999 /* Shared interrupt */
6604 goto none; 10000 goto none;
6605 } 10001 }
@@ -6608,8 +10004,8 @@ static irqreturn_t ipw_isr(int irq, void *data, struct pt_regs *regs)
6608 ipw_disable_interrupts(priv); 10004 ipw_disable_interrupts(priv);
6609 10005
6610 /* ack current interrupts */ 10006 /* ack current interrupts */
6611 inta &= (CX2_INTA_MASK_ALL & inta_mask); 10007 inta &= (IPW_INTA_MASK_ALL & inta_mask);
6612 ipw_write32(priv, CX2_INTA_RW, inta); 10008 ipw_write32(priv, IPW_INTA_RW, inta);
6613 10009
6614 /* Cache INTA value for our tasklet */ 10010 /* Cache INTA value for our tasklet */
6615 priv->isr_inta = inta; 10011 priv->isr_inta = inta;
@@ -6655,28 +10051,116 @@ static void ipw_rf_kill(void *adapter)
6655 spin_unlock_irqrestore(&priv->lock, flags); 10051 spin_unlock_irqrestore(&priv->lock, flags);
6656} 10052}
6657 10053
10054static void ipw_bg_rf_kill(void *data)
10055{
10056 struct ipw_priv *priv = data;
10057 down(&priv->sem);
10058 ipw_rf_kill(data);
10059 up(&priv->sem);
10060}
10061
10062void ipw_link_up(struct ipw_priv *priv)
10063{
10064 priv->last_seq_num = -1;
10065 priv->last_frag_num = -1;
10066 priv->last_packet_time = 0;
10067
10068 netif_carrier_on(priv->net_dev);
10069 if (netif_queue_stopped(priv->net_dev)) {
10070 IPW_DEBUG_NOTIF("waking queue\n");
10071 netif_wake_queue(priv->net_dev);
10072 } else {
10073 IPW_DEBUG_NOTIF("starting queue\n");
10074 netif_start_queue(priv->net_dev);
10075 }
10076
10077 cancel_delayed_work(&priv->request_scan);
10078 ipw_reset_stats(priv);
10079 /* Ensure the rate is updated immediately */
10080 priv->last_rate = ipw_get_current_rate(priv);
10081 ipw_gather_stats(priv);
10082 ipw_led_link_up(priv);
10083 notify_wx_assoc_event(priv);
10084
10085 if (priv->config & CFG_BACKGROUND_SCAN)
10086 queue_delayed_work(priv->workqueue, &priv->request_scan, HZ);
10087}
10088
10089static void ipw_bg_link_up(void *data)
10090{
10091 struct ipw_priv *priv = data;
10092 down(&priv->sem);
10093 ipw_link_up(data);
10094 up(&priv->sem);
10095}
10096
10097void ipw_link_down(struct ipw_priv *priv)
10098{
10099 ipw_led_link_down(priv);
10100 netif_carrier_off(priv->net_dev);
10101 netif_stop_queue(priv->net_dev);
10102 notify_wx_assoc_event(priv);
10103
10104 /* Cancel any queued work ... */
10105 cancel_delayed_work(&priv->request_scan);
10106 cancel_delayed_work(&priv->adhoc_check);
10107 cancel_delayed_work(&priv->gather_stats);
10108
10109 ipw_reset_stats(priv);
10110
10111 if (!(priv->status & STATUS_EXIT_PENDING)) {
10112 /* Queue up another scan... */
10113 queue_work(priv->workqueue, &priv->request_scan);
10114 }
10115}
10116
10117static void ipw_bg_link_down(void *data)
10118{
10119 struct ipw_priv *priv = data;
10120 down(&priv->sem);
10121 ipw_link_down(data);
10122 up(&priv->sem);
10123}
10124
6658static int ipw_setup_deferred_work(struct ipw_priv *priv) 10125static int ipw_setup_deferred_work(struct ipw_priv *priv)
6659{ 10126{
6660 int ret = 0; 10127 int ret = 0;
6661 10128
6662 priv->workqueue = create_workqueue(DRV_NAME); 10129 priv->workqueue = create_workqueue(DRV_NAME);
6663 init_waitqueue_head(&priv->wait_command_queue); 10130 init_waitqueue_head(&priv->wait_command_queue);
6664 10131 init_waitqueue_head(&priv->wait_state);
6665 INIT_WORK(&priv->adhoc_check, ipw_adhoc_check, priv); 10132
6666 INIT_WORK(&priv->associate, ipw_associate, priv); 10133 INIT_WORK(&priv->adhoc_check, ipw_bg_adhoc_check, priv);
6667 INIT_WORK(&priv->disassociate, ipw_disassociate, priv); 10134 INIT_WORK(&priv->associate, ipw_bg_associate, priv);
6668 INIT_WORK(&priv->rx_replenish, ipw_rx_queue_replenish, priv); 10135 INIT_WORK(&priv->disassociate, ipw_bg_disassociate, priv);
6669 INIT_WORK(&priv->adapter_restart, ipw_adapter_restart, priv); 10136 INIT_WORK(&priv->system_config, ipw_system_config, priv);
6670 INIT_WORK(&priv->rf_kill, ipw_rf_kill, priv); 10137 INIT_WORK(&priv->rx_replenish, ipw_bg_rx_queue_replenish, priv);
6671 INIT_WORK(&priv->up, (void (*)(void *))ipw_up, priv); 10138 INIT_WORK(&priv->adapter_restart, ipw_bg_adapter_restart, priv);
6672 INIT_WORK(&priv->down, (void (*)(void *))ipw_down, priv); 10139 INIT_WORK(&priv->rf_kill, ipw_bg_rf_kill, priv);
10140 INIT_WORK(&priv->up, (void (*)(void *))ipw_bg_up, priv);
10141 INIT_WORK(&priv->down, (void (*)(void *))ipw_bg_down, priv);
6673 INIT_WORK(&priv->request_scan, 10142 INIT_WORK(&priv->request_scan,
6674 (void (*)(void *))ipw_request_scan, priv); 10143 (void (*)(void *))ipw_request_scan, priv);
6675 INIT_WORK(&priv->gather_stats, 10144 INIT_WORK(&priv->gather_stats,
6676 (void (*)(void *))ipw_gather_stats, priv); 10145 (void (*)(void *))ipw_bg_gather_stats, priv);
6677 INIT_WORK(&priv->abort_scan, (void (*)(void *))ipw_abort_scan, priv); 10146 INIT_WORK(&priv->abort_scan, (void (*)(void *))ipw_bg_abort_scan, priv);
6678 INIT_WORK(&priv->roam, ipw_roam, priv); 10147 INIT_WORK(&priv->roam, ipw_bg_roam, priv);
6679 INIT_WORK(&priv->scan_check, ipw_scan_check, priv); 10148 INIT_WORK(&priv->scan_check, ipw_bg_scan_check, priv);
10149 INIT_WORK(&priv->link_up, (void (*)(void *))ipw_bg_link_up, priv);
10150 INIT_WORK(&priv->link_down, (void (*)(void *))ipw_bg_link_down, priv);
10151 INIT_WORK(&priv->led_link_on, (void (*)(void *))ipw_bg_led_link_on,
10152 priv);
10153 INIT_WORK(&priv->led_link_off, (void (*)(void *))ipw_bg_led_link_off,
10154 priv);
10155 INIT_WORK(&priv->led_act_off, (void (*)(void *))ipw_bg_led_activity_off,
10156 priv);
10157 INIT_WORK(&priv->merge_networks,
10158 (void (*)(void *))ipw_merge_adhoc_network, priv);
10159
10160#ifdef CONFIG_IPW_QOS
10161 INIT_WORK(&priv->qos_activate, (void (*)(void *))ipw_bg_qos_activate,
10162 priv);
10163#endif /* CONFIG_IPW_QOS */
6680 10164
6681 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) 10165 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6682 ipw_irq_tasklet, (unsigned long)priv); 10166 ipw_irq_tasklet, (unsigned long)priv);
@@ -6689,34 +10173,36 @@ static void shim__set_security(struct net_device *dev,
6689{ 10173{
6690 struct ipw_priv *priv = ieee80211_priv(dev); 10174 struct ipw_priv *priv = ieee80211_priv(dev);
6691 int i; 10175 int i;
6692
6693 for (i = 0; i < 4; i++) { 10176 for (i = 0; i < 4; i++) {
6694 if (sec->flags & (1 << i)) { 10177 if (sec->flags & (1 << i)) {
6695 priv->sec.key_sizes[i] = sec->key_sizes[i]; 10178 priv->ieee->sec.encode_alg[i] = sec->encode_alg[i];
10179 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
6696 if (sec->key_sizes[i] == 0) 10180 if (sec->key_sizes[i] == 0)
6697 priv->sec.flags &= ~(1 << i); 10181 priv->ieee->sec.flags &= ~(1 << i);
6698 else 10182 else {
6699 memcpy(priv->sec.keys[i], sec->keys[i], 10183 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
6700 sec->key_sizes[i]); 10184 sec->key_sizes[i]);
6701 priv->sec.flags |= (1 << i); 10185 priv->ieee->sec.flags |= (1 << i);
10186 }
6702 priv->status |= STATUS_SECURITY_UPDATED; 10187 priv->status |= STATUS_SECURITY_UPDATED;
6703 } 10188 } else if (sec->level != SEC_LEVEL_1)
10189 priv->ieee->sec.flags &= ~(1 << i);
6704 } 10190 }
6705 10191
6706 if ((sec->flags & SEC_ACTIVE_KEY) && 10192 if (sec->flags & SEC_ACTIVE_KEY) {
6707 priv->sec.active_key != sec->active_key) {
6708 if (sec->active_key <= 3) { 10193 if (sec->active_key <= 3) {
6709 priv->sec.active_key = sec->active_key; 10194 priv->ieee->sec.active_key = sec->active_key;
6710 priv->sec.flags |= SEC_ACTIVE_KEY; 10195 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
6711 } else 10196 } else
6712 priv->sec.flags &= ~SEC_ACTIVE_KEY; 10197 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
6713 priv->status |= STATUS_SECURITY_UPDATED; 10198 priv->status |= STATUS_SECURITY_UPDATED;
6714 } 10199 } else
10200 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
6715 10201
6716 if ((sec->flags & SEC_AUTH_MODE) && 10202 if ((sec->flags & SEC_AUTH_MODE) &&
6717 (priv->sec.auth_mode != sec->auth_mode)) { 10203 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
6718 priv->sec.auth_mode = sec->auth_mode; 10204 priv->ieee->sec.auth_mode = sec->auth_mode;
6719 priv->sec.flags |= SEC_AUTH_MODE; 10205 priv->ieee->sec.flags |= SEC_AUTH_MODE;
6720 if (sec->auth_mode == WLAN_AUTH_SHARED_KEY) 10206 if (sec->auth_mode == WLAN_AUTH_SHARED_KEY)
6721 priv->capability |= CAP_SHARED_KEY; 10207 priv->capability |= CAP_SHARED_KEY;
6722 else 10208 else
@@ -6724,9 +10210,9 @@ static void shim__set_security(struct net_device *dev,
6724 priv->status |= STATUS_SECURITY_UPDATED; 10210 priv->status |= STATUS_SECURITY_UPDATED;
6725 } 10211 }
6726 10212
6727 if (sec->flags & SEC_ENABLED && priv->sec.enabled != sec->enabled) { 10213 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
6728 priv->sec.flags |= SEC_ENABLED; 10214 priv->ieee->sec.flags |= SEC_ENABLED;
6729 priv->sec.enabled = sec->enabled; 10215 priv->ieee->sec.enabled = sec->enabled;
6730 priv->status |= STATUS_SECURITY_UPDATED; 10216 priv->status |= STATUS_SECURITY_UPDATED;
6731 if (sec->enabled) 10217 if (sec->enabled)
6732 priv->capability |= CAP_PRIVACY_ON; 10218 priv->capability |= CAP_PRIVACY_ON;
@@ -6734,12 +10220,18 @@ static void shim__set_security(struct net_device *dev,
6734 priv->capability &= ~CAP_PRIVACY_ON; 10220 priv->capability &= ~CAP_PRIVACY_ON;
6735 } 10221 }
6736 10222
6737 if (sec->flags & SEC_LEVEL && priv->sec.level != sec->level) { 10223 if (sec->flags & SEC_ENCRYPT)
6738 priv->sec.level = sec->level; 10224 priv->ieee->sec.encrypt = sec->encrypt;
6739 priv->sec.flags |= SEC_LEVEL; 10225
10226 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
10227 priv->ieee->sec.level = sec->level;
10228 priv->ieee->sec.flags |= SEC_LEVEL;
6740 priv->status |= STATUS_SECURITY_UPDATED; 10229 priv->status |= STATUS_SECURITY_UPDATED;
6741 } 10230 }
6742 10231
10232 if (!priv->ieee->host_encrypt && (sec->flags & SEC_ENCRYPT))
10233 ipw_set_hwcrypto_keys(priv);
10234
6743 /* To match current functionality of ipw2100 (which works well w/ 10235 /* To match current functionality of ipw2100 (which works well w/
6744 * various supplicants, we don't force a disassociate if the 10236 * various supplicants, we don't force a disassociate if the
6745 * privacy capability changes ... */ 10237 * privacy capability changes ... */
@@ -6788,29 +10280,10 @@ static int init_supported_rates(struct ipw_priv *priv,
6788 10280
6789static int ipw_config(struct ipw_priv *priv) 10281static int ipw_config(struct ipw_priv *priv)
6790{ 10282{
6791 int i;
6792 struct ipw_tx_power tx_power;
6793
6794 memset(&priv->sys_config, 0, sizeof(priv->sys_config));
6795 memset(&tx_power, 0, sizeof(tx_power));
6796
6797 /* This is only called from ipw_up, which resets/reloads the firmware 10283 /* This is only called from ipw_up, which resets/reloads the firmware
6798 so, we don't need to first disable the card before we configure 10284 so, we don't need to first disable the card before we configure
6799 it */ 10285 it */
6800 10286 if (ipw_set_tx_power(priv))
6801 /* configure device for 'G' band */
6802 tx_power.ieee_mode = IPW_G_MODE;
6803 tx_power.num_channels = 11;
6804 for (i = 0; i < 11; i++) {
6805 tx_power.channels_tx_power[i].channel_number = i + 1;
6806 tx_power.channels_tx_power[i].tx_power = priv->tx_power;
6807 }
6808 if (ipw_send_tx_power(priv, &tx_power))
6809 goto error;
6810
6811 /* configure device to also handle 'B' band */
6812 tx_power.ieee_mode = IPW_B_MODE;
6813 if (ipw_send_tx_power(priv, &tx_power))
6814 goto error; 10287 goto error;
6815 10288
6816 /* initialize adapter address */ 10289 /* initialize adapter address */
@@ -6819,6 +10292,11 @@ static int ipw_config(struct ipw_priv *priv)
6819 10292
6820 /* set basic system config settings */ 10293 /* set basic system config settings */
6821 init_sys_config(&priv->sys_config); 10294 init_sys_config(&priv->sys_config);
10295 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
10296 priv->sys_config.answer_broadcast_ssid_probe = 1;
10297 else
10298 priv->sys_config.answer_broadcast_ssid_probe = 0;
10299
6822 if (ipw_send_system_config(priv, &priv->sys_config)) 10300 if (ipw_send_system_config(priv, &priv->sys_config))
6823 goto error; 10301 goto error;
6824 10302
@@ -6831,6 +10309,10 @@ static int ipw_config(struct ipw_priv *priv)
6831 if (ipw_send_rts_threshold(priv, priv->rts_threshold)) 10309 if (ipw_send_rts_threshold(priv, priv->rts_threshold))
6832 goto error; 10310 goto error;
6833 } 10311 }
10312#ifdef CONFIG_IPW_QOS
10313 IPW_DEBUG_QOS("QoS: call ipw_qos_activate\n");
10314 ipw_qos_activate(priv, NULL);
10315#endif /* CONFIG_IPW_QOS */
6834 10316
6835 if (ipw_set_random_seed(priv)) 10317 if (ipw_set_random_seed(priv))
6836 goto error; 10318 goto error;
@@ -6839,9 +10321,17 @@ static int ipw_config(struct ipw_priv *priv)
6839 if (ipw_send_host_complete(priv)) 10321 if (ipw_send_host_complete(priv))
6840 goto error; 10322 goto error;
6841 10323
6842 /* If configured to try and auto-associate, kick off a scan */ 10324 priv->status |= STATUS_INIT;
6843 if ((priv->config & CFG_ASSOCIATE) && ipw_request_scan(priv)) 10325
6844 goto error; 10326 ipw_led_init(priv);
10327 ipw_led_radio_on(priv);
10328 priv->notif_missed_beacons = 0;
10329
10330 /* Set hardware WEP key if it is configured. */
10331 if ((priv->capability & CAP_PRIVACY_ON) &&
10332 (priv->ieee->sec.level == SEC_LEVEL_1) &&
10333 !(priv->ieee->host_encrypt || priv->ieee->host_decrypt))
10334 ipw_set_hwcrypto_keys(priv);
6845 10335
6846 return 0; 10336 return 0;
6847 10337
@@ -6849,20 +10339,379 @@ static int ipw_config(struct ipw_priv *priv)
6849 return -EIO; 10339 return -EIO;
6850} 10340}
6851 10341
10342/*
10343 * NOTE:
10344 *
10345 * These tables have been tested in conjunction with the
10346 * Intel PRO/Wireless 2200BG and 2915ABG Network Connection Adapters.
10347 *
10348 * Altering this values, using it on other hardware, or in geographies
10349 * not intended for resale of the above mentioned Intel adapters has
10350 * not been tested.
10351 *
10352 */
10353static const struct ieee80211_geo ipw_geos[] = {
10354 { /* Restricted */
10355 "---",
10356 .bg_channels = 11,
10357 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10358 {2427, 4}, {2432, 5}, {2437, 6},
10359 {2442, 7}, {2447, 8}, {2452, 9},
10360 {2457, 10}, {2462, 11}},
10361 },
10362
10363 { /* Custom US/Canada */
10364 "ZZF",
10365 .bg_channels = 11,
10366 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10367 {2427, 4}, {2432, 5}, {2437, 6},
10368 {2442, 7}, {2447, 8}, {2452, 9},
10369 {2457, 10}, {2462, 11}},
10370 .a_channels = 8,
10371 .a = {{5180, 36},
10372 {5200, 40},
10373 {5220, 44},
10374 {5240, 48},
10375 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10376 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10377 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10378 {5320, 64, IEEE80211_CH_PASSIVE_ONLY}},
10379 },
10380
10381 { /* Rest of World */
10382 "ZZD",
10383 .bg_channels = 13,
10384 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10385 {2427, 4}, {2432, 5}, {2437, 6},
10386 {2442, 7}, {2447, 8}, {2452, 9},
10387 {2457, 10}, {2462, 11}, {2467, 12},
10388 {2472, 13}},
10389 },
10390
10391 { /* Custom USA & Europe & High */
10392 "ZZA",
10393 .bg_channels = 11,
10394 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10395 {2427, 4}, {2432, 5}, {2437, 6},
10396 {2442, 7}, {2447, 8}, {2452, 9},
10397 {2457, 10}, {2462, 11}},
10398 .a_channels = 13,
10399 .a = {{5180, 36},
10400 {5200, 40},
10401 {5220, 44},
10402 {5240, 48},
10403 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10404 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10405 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10406 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10407 {5745, 149},
10408 {5765, 153},
10409 {5785, 157},
10410 {5805, 161},
10411 {5825, 165}},
10412 },
10413
10414 { /* Custom NA & Europe */
10415 "ZZB",
10416 .bg_channels = 11,
10417 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10418 {2427, 4}, {2432, 5}, {2437, 6},
10419 {2442, 7}, {2447, 8}, {2452, 9},
10420 {2457, 10}, {2462, 11}},
10421 .a_channels = 13,
10422 .a = {{5180, 36},
10423 {5200, 40},
10424 {5220, 44},
10425 {5240, 48},
10426 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10427 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10428 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10429 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10430 {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10431 {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10432 {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10433 {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10434 {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10435 },
10436
10437 { /* Custom Japan */
10438 "ZZC",
10439 .bg_channels = 11,
10440 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10441 {2427, 4}, {2432, 5}, {2437, 6},
10442 {2442, 7}, {2447, 8}, {2452, 9},
10443 {2457, 10}, {2462, 11}},
10444 .a_channels = 4,
10445 .a = {{5170, 34}, {5190, 38},
10446 {5210, 42}, {5230, 46}},
10447 },
10448
10449 { /* Custom */
10450 "ZZM",
10451 .bg_channels = 11,
10452 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10453 {2427, 4}, {2432, 5}, {2437, 6},
10454 {2442, 7}, {2447, 8}, {2452, 9},
10455 {2457, 10}, {2462, 11}},
10456 },
10457
10458 { /* Europe */
10459 "ZZE",
10460 .bg_channels = 13,
10461 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10462 {2427, 4}, {2432, 5}, {2437, 6},
10463 {2442, 7}, {2447, 8}, {2452, 9},
10464 {2457, 10}, {2462, 11}, {2467, 12},
10465 {2472, 13}},
10466 .a_channels = 19,
10467 .a = {{5180, 36},
10468 {5200, 40},
10469 {5220, 44},
10470 {5240, 48},
10471 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10472 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10473 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10474 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10475 {5500, 100, IEEE80211_CH_PASSIVE_ONLY},
10476 {5520, 104, IEEE80211_CH_PASSIVE_ONLY},
10477 {5540, 108, IEEE80211_CH_PASSIVE_ONLY},
10478 {5560, 112, IEEE80211_CH_PASSIVE_ONLY},
10479 {5580, 116, IEEE80211_CH_PASSIVE_ONLY},
10480 {5600, 120, IEEE80211_CH_PASSIVE_ONLY},
10481 {5620, 124, IEEE80211_CH_PASSIVE_ONLY},
10482 {5640, 128, IEEE80211_CH_PASSIVE_ONLY},
10483 {5660, 132, IEEE80211_CH_PASSIVE_ONLY},
10484 {5680, 136, IEEE80211_CH_PASSIVE_ONLY},
10485 {5700, 140, IEEE80211_CH_PASSIVE_ONLY}},
10486 },
10487
10488 { /* Custom Japan */
10489 "ZZJ",
10490 .bg_channels = 14,
10491 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10492 {2427, 4}, {2432, 5}, {2437, 6},
10493 {2442, 7}, {2447, 8}, {2452, 9},
10494 {2457, 10}, {2462, 11}, {2467, 12},
10495 {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY}},
10496 .a_channels = 4,
10497 .a = {{5170, 34}, {5190, 38},
10498 {5210, 42}, {5230, 46}},
10499 },
10500
10501 { /* Rest of World */
10502 "ZZR",
10503 .bg_channels = 14,
10504 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10505 {2427, 4}, {2432, 5}, {2437, 6},
10506 {2442, 7}, {2447, 8}, {2452, 9},
10507 {2457, 10}, {2462, 11}, {2467, 12},
10508 {2472, 13}, {2484, 14, IEEE80211_CH_B_ONLY |
10509 IEEE80211_CH_PASSIVE_ONLY}},
10510 },
10511
10512 { /* High Band */
10513 "ZZH",
10514 .bg_channels = 13,
10515 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10516 {2427, 4}, {2432, 5}, {2437, 6},
10517 {2442, 7}, {2447, 8}, {2452, 9},
10518 {2457, 10}, {2462, 11},
10519 {2467, 12, IEEE80211_CH_PASSIVE_ONLY},
10520 {2472, 13, IEEE80211_CH_PASSIVE_ONLY}},
10521 .a_channels = 4,
10522 .a = {{5745, 149}, {5765, 153},
10523 {5785, 157}, {5805, 161}},
10524 },
10525
10526 { /* Custom Europe */
10527 "ZZG",
10528 .bg_channels = 13,
10529 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10530 {2427, 4}, {2432, 5}, {2437, 6},
10531 {2442, 7}, {2447, 8}, {2452, 9},
10532 {2457, 10}, {2462, 11},
10533 {2467, 12}, {2472, 13}},
10534 .a_channels = 4,
10535 .a = {{5180, 36}, {5200, 40},
10536 {5220, 44}, {5240, 48}},
10537 },
10538
10539 { /* Europe */
10540 "ZZK",
10541 .bg_channels = 13,
10542 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10543 {2427, 4}, {2432, 5}, {2437, 6},
10544 {2442, 7}, {2447, 8}, {2452, 9},
10545 {2457, 10}, {2462, 11},
10546 {2467, 12, IEEE80211_CH_PASSIVE_ONLY},
10547 {2472, 13, IEEE80211_CH_PASSIVE_ONLY}},
10548 .a_channels = 24,
10549 .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY},
10550 {5200, 40, IEEE80211_CH_PASSIVE_ONLY},
10551 {5220, 44, IEEE80211_CH_PASSIVE_ONLY},
10552 {5240, 48, IEEE80211_CH_PASSIVE_ONLY},
10553 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10554 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10555 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10556 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10557 {5500, 100, IEEE80211_CH_PASSIVE_ONLY},
10558 {5520, 104, IEEE80211_CH_PASSIVE_ONLY},
10559 {5540, 108, IEEE80211_CH_PASSIVE_ONLY},
10560 {5560, 112, IEEE80211_CH_PASSIVE_ONLY},
10561 {5580, 116, IEEE80211_CH_PASSIVE_ONLY},
10562 {5600, 120, IEEE80211_CH_PASSIVE_ONLY},
10563 {5620, 124, IEEE80211_CH_PASSIVE_ONLY},
10564 {5640, 128, IEEE80211_CH_PASSIVE_ONLY},
10565 {5660, 132, IEEE80211_CH_PASSIVE_ONLY},
10566 {5680, 136, IEEE80211_CH_PASSIVE_ONLY},
10567 {5700, 140, IEEE80211_CH_PASSIVE_ONLY},
10568 {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10569 {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10570 {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10571 {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10572 {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10573 },
10574
10575 { /* Europe */
10576 "ZZL",
10577 .bg_channels = 11,
10578 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
10579 {2427, 4}, {2432, 5}, {2437, 6},
10580 {2442, 7}, {2447, 8}, {2452, 9},
10581 {2457, 10}, {2462, 11}},
10582 .a_channels = 13,
10583 .a = {{5180, 36, IEEE80211_CH_PASSIVE_ONLY},
10584 {5200, 40, IEEE80211_CH_PASSIVE_ONLY},
10585 {5220, 44, IEEE80211_CH_PASSIVE_ONLY},
10586 {5240, 48, IEEE80211_CH_PASSIVE_ONLY},
10587 {5260, 52, IEEE80211_CH_PASSIVE_ONLY},
10588 {5280, 56, IEEE80211_CH_PASSIVE_ONLY},
10589 {5300, 60, IEEE80211_CH_PASSIVE_ONLY},
10590 {5320, 64, IEEE80211_CH_PASSIVE_ONLY},
10591 {5745, 149, IEEE80211_CH_PASSIVE_ONLY},
10592 {5765, 153, IEEE80211_CH_PASSIVE_ONLY},
10593 {5785, 157, IEEE80211_CH_PASSIVE_ONLY},
10594 {5805, 161, IEEE80211_CH_PASSIVE_ONLY},
10595 {5825, 165, IEEE80211_CH_PASSIVE_ONLY}},
10596 }
10597};
10598
10599/* GEO code borrowed from ieee80211_geo.c */
10600static int ipw_is_valid_channel(struct ieee80211_device *ieee, u8 channel)
10601{
10602 int i;
10603
10604 /* Driver needs to initialize the geography map before using
10605 * these helper functions */
10606 BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
10607
10608 if (ieee->freq_band & IEEE80211_24GHZ_BAND)
10609 for (i = 0; i < ieee->geo.bg_channels; i++)
10610 /* NOTE: If G mode is currently supported but
10611 * this is a B only channel, we don't see it
10612 * as valid. */
10613 if ((ieee->geo.bg[i].channel == channel) &&
10614 (!(ieee->mode & IEEE_G) ||
10615 !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY)))
10616 return IEEE80211_24GHZ_BAND;
10617
10618 if (ieee->freq_band & IEEE80211_52GHZ_BAND)
10619 for (i = 0; i < ieee->geo.a_channels; i++)
10620 if (ieee->geo.a[i].channel == channel)
10621 return IEEE80211_52GHZ_BAND;
10622
10623 return 0;
10624}
10625
10626static int ipw_channel_to_index(struct ieee80211_device *ieee, u8 channel)
10627{
10628 int i;
10629
10630 /* Driver needs to initialize the geography map before using
10631 * these helper functions */
10632 BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
10633
10634 if (ieee->freq_band & IEEE80211_24GHZ_BAND)
10635 for (i = 0; i < ieee->geo.bg_channels; i++)
10636 if (ieee->geo.bg[i].channel == channel)
10637 return i;
10638
10639 if (ieee->freq_band & IEEE80211_52GHZ_BAND)
10640 for (i = 0; i < ieee->geo.a_channels; i++)
10641 if (ieee->geo.a[i].channel == channel)
10642 return i;
10643
10644 return -1;
10645}
10646
10647static u8 ipw_freq_to_channel(struct ieee80211_device *ieee, u32 freq)
10648{
10649 int i;
10650
10651 /* Driver needs to initialize the geography map before using
10652 * these helper functions */
10653 BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0);
10654
10655 freq /= 100000;
10656
10657 if (ieee->freq_band & IEEE80211_24GHZ_BAND)
10658 for (i = 0; i < ieee->geo.bg_channels; i++)
10659 if (ieee->geo.bg[i].freq == freq)
10660 return ieee->geo.bg[i].channel;
10661
10662 if (ieee->freq_band & IEEE80211_52GHZ_BAND)
10663 for (i = 0; i < ieee->geo.a_channels; i++)
10664 if (ieee->geo.a[i].freq == freq)
10665 return ieee->geo.a[i].channel;
10666
10667 return 0;
10668}
10669
10670static int ipw_set_geo(struct ieee80211_device *ieee,
10671 const struct ieee80211_geo *geo)
10672{
10673 memcpy(ieee->geo.name, geo->name, 3);
10674 ieee->geo.name[3] = '\0';
10675 ieee->geo.bg_channels = geo->bg_channels;
10676 ieee->geo.a_channels = geo->a_channels;
10677 memcpy(ieee->geo.bg, geo->bg, geo->bg_channels *
10678 sizeof(struct ieee80211_channel));
10679 memcpy(ieee->geo.a, geo->a, ieee->geo.a_channels *
10680 sizeof(struct ieee80211_channel));
10681 return 0;
10682}
10683
10684static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *ieee)
10685{
10686 return &ieee->geo;
10687}
10688
6852#define MAX_HW_RESTARTS 5 10689#define MAX_HW_RESTARTS 5
6853static int ipw_up(struct ipw_priv *priv) 10690static int ipw_up(struct ipw_priv *priv)
6854{ 10691{
6855 int rc, i; 10692 int rc, i, j;
6856 10693
6857 if (priv->status & STATUS_EXIT_PENDING) 10694 if (priv->status & STATUS_EXIT_PENDING)
6858 return -EIO; 10695 return -EIO;
6859 10696
10697 if (cmdlog && !priv->cmdlog) {
10698 priv->cmdlog = kmalloc(sizeof(*priv->cmdlog) * cmdlog,
10699 GFP_KERNEL);
10700 if (priv->cmdlog == NULL) {
10701 IPW_ERROR("Error allocating %d command log entries.\n",
10702 cmdlog);
10703 } else {
10704 memset(priv->cmdlog, 0, sizeof(*priv->cmdlog) * cmdlog);
10705 priv->cmdlog_len = cmdlog;
10706 }
10707 }
10708
6860 for (i = 0; i < MAX_HW_RESTARTS; i++) { 10709 for (i = 0; i < MAX_HW_RESTARTS; i++) {
6861 /* Load the microcode, firmware, and eeprom. 10710 /* Load the microcode, firmware, and eeprom.
6862 * Also start the clocks. */ 10711 * Also start the clocks. */
6863 rc = ipw_load(priv); 10712 rc = ipw_load(priv);
6864 if (rc) { 10713 if (rc) {
6865 IPW_ERROR("Unable to load firmware: 0x%08X\n", rc); 10714 IPW_ERROR("Unable to load firmware: %d\n", rc);
6866 return rc; 10715 return rc;
6867 } 10716 }
6868 10717
@@ -6871,20 +10720,50 @@ static int ipw_up(struct ipw_priv *priv)
6871 eeprom_parse_mac(priv, priv->mac_addr); 10720 eeprom_parse_mac(priv, priv->mac_addr);
6872 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN); 10721 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
6873 10722
6874 if (priv->status & STATUS_RF_KILL_MASK) 10723 for (j = 0; j < ARRAY_SIZE(ipw_geos); j++) {
10724 if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE],
10725 ipw_geos[j].name, 3))
10726 break;
10727 }
10728 if (j == ARRAY_SIZE(ipw_geos)) {
10729 IPW_WARNING("SKU [%c%c%c] not recognized.\n",
10730 priv->eeprom[EEPROM_COUNTRY_CODE + 0],
10731 priv->eeprom[EEPROM_COUNTRY_CODE + 1],
10732 priv->eeprom[EEPROM_COUNTRY_CODE + 2]);
10733 j = 0;
10734 }
10735 if (ipw_set_geo(priv->ieee, &ipw_geos[j])) {
10736 IPW_WARNING("Could not set geography.");
10737 return 0;
10738 }
10739
10740 IPW_DEBUG_INFO("Geography %03d [%s] detected.\n",
10741 j, priv->ieee->geo.name);
10742
10743 if (priv->status & STATUS_RF_KILL_SW) {
10744 IPW_WARNING("Radio disabled by module parameter.\n");
10745 return 0;
10746 } else if (rf_kill_active(priv)) {
10747 IPW_WARNING("Radio Frequency Kill Switch is On:\n"
10748 "Kill switch must be turned off for "
10749 "wireless networking to work.\n");
10750 queue_delayed_work(priv->workqueue, &priv->rf_kill,
10751 2 * HZ);
6875 return 0; 10752 return 0;
10753 }
6876 10754
6877 rc = ipw_config(priv); 10755 rc = ipw_config(priv);
6878 if (!rc) { 10756 if (!rc) {
6879 IPW_DEBUG_INFO("Configured device on count %i\n", i); 10757 IPW_DEBUG_INFO("Configured device on count %i\n", i);
6880 priv->notif_missed_beacons = 0; 10758
6881 netif_start_queue(priv->net_dev); 10759 /* If configure to try and auto-associate, kick
10760 * off a scan. */
10761 queue_work(priv->workqueue, &priv->request_scan);
10762
6882 return 0; 10763 return 0;
6883 } else {
6884 IPW_DEBUG_INFO("Device configuration failed: 0x%08X\n",
6885 rc);
6886 } 10764 }
6887 10765
10766 IPW_DEBUG_INFO("Device configuration failed: 0x%08X\n", rc);
6888 IPW_DEBUG_INFO("Failed to config device on retry %d of %d\n", 10767 IPW_DEBUG_INFO("Failed to config device on retry %d of %d\n",
6889 i, MAX_HW_RESTARTS); 10768 i, MAX_HW_RESTARTS);
6890 10769
@@ -6896,47 +10775,101 @@ static int ipw_up(struct ipw_priv *priv)
6896 /* tried to restart and config the device for as long as our 10775 /* tried to restart and config the device for as long as our
6897 * patience could withstand */ 10776 * patience could withstand */
6898 IPW_ERROR("Unable to initialize device after %d attempts.\n", i); 10777 IPW_ERROR("Unable to initialize device after %d attempts.\n", i);
10778
6899 return -EIO; 10779 return -EIO;
6900} 10780}
6901 10781
6902static void ipw_down(struct ipw_priv *priv) 10782static void ipw_bg_up(void *data)
10783{
10784 struct ipw_priv *priv = data;
10785 down(&priv->sem);
10786 ipw_up(data);
10787 up(&priv->sem);
10788}
10789
10790static void ipw_deinit(struct ipw_priv *priv)
6903{ 10791{
10792 int i;
10793
10794 if (priv->status & STATUS_SCANNING) {
10795 IPW_DEBUG_INFO("Aborting scan during shutdown.\n");
10796 ipw_abort_scan(priv);
10797 }
10798
10799 if (priv->status & STATUS_ASSOCIATED) {
10800 IPW_DEBUG_INFO("Disassociating during shutdown.\n");
10801 ipw_disassociate(priv);
10802 }
10803
10804 ipw_led_shutdown(priv);
10805
10806 /* Wait up to 1s for status to change to not scanning and not
10807 * associated (disassociation can take a while for a ful 802.11
10808 * exchange */
10809 for (i = 1000; i && (priv->status &
10810 (STATUS_DISASSOCIATING |
10811 STATUS_ASSOCIATED | STATUS_SCANNING)); i--)
10812 udelay(10);
10813
10814 if (priv->status & (STATUS_DISASSOCIATING |
10815 STATUS_ASSOCIATED | STATUS_SCANNING))
10816 IPW_DEBUG_INFO("Still associated or scanning...\n");
10817 else
10818 IPW_DEBUG_INFO("Took %dms to de-init\n", 1000 - i);
10819
6904 /* Attempt to disable the card */ 10820 /* Attempt to disable the card */
6905#if 0
6906 ipw_send_card_disable(priv, 0); 10821 ipw_send_card_disable(priv, 0);
6907#endif 10822
10823 priv->status &= ~STATUS_INIT;
10824}
10825
10826static void ipw_down(struct ipw_priv *priv)
10827{
10828 int exit_pending = priv->status & STATUS_EXIT_PENDING;
10829
10830 priv->status |= STATUS_EXIT_PENDING;
10831
10832 if (ipw_is_init(priv))
10833 ipw_deinit(priv);
10834
10835 /* Wipe out the EXIT_PENDING status bit if we are not actually
10836 * exiting the module */
10837 if (!exit_pending)
10838 priv->status &= ~STATUS_EXIT_PENDING;
6908 10839
6909 /* tell the device to stop sending interrupts */ 10840 /* tell the device to stop sending interrupts */
6910 ipw_disable_interrupts(priv); 10841 ipw_disable_interrupts(priv);
6911 10842
6912 /* Clear all bits but the RF Kill */ 10843 /* Clear all bits but the RF Kill */
6913 priv->status &= STATUS_RF_KILL_MASK; 10844 priv->status &= STATUS_RF_KILL_MASK | STATUS_EXIT_PENDING;
6914
6915 netif_carrier_off(priv->net_dev); 10845 netif_carrier_off(priv->net_dev);
6916 netif_stop_queue(priv->net_dev); 10846 netif_stop_queue(priv->net_dev);
6917 10847
6918 ipw_stop_nic(priv); 10848 ipw_stop_nic(priv);
10849
10850 ipw_led_radio_off(priv);
10851}
10852
10853static void ipw_bg_down(void *data)
10854{
10855 struct ipw_priv *priv = data;
10856 down(&priv->sem);
10857 ipw_down(data);
10858 up(&priv->sem);
6919} 10859}
6920 10860
6921/* Called by register_netdev() */ 10861/* Called by register_netdev() */
6922static int ipw_net_init(struct net_device *dev) 10862static int ipw_net_init(struct net_device *dev)
6923{ 10863{
6924 struct ipw_priv *priv = ieee80211_priv(dev); 10864 struct ipw_priv *priv = ieee80211_priv(dev);
10865 down(&priv->sem);
6925 10866
6926 if (priv->status & STATUS_RF_KILL_SW) { 10867 if (ipw_up(priv)) {
6927 IPW_WARNING("Radio disabled by module parameter.\n"); 10868 up(&priv->sem);
6928 return 0;
6929 } else if (rf_kill_active(priv)) {
6930 IPW_WARNING("Radio Frequency Kill Switch is On:\n"
6931 "Kill switch must be turned off for "
6932 "wireless networking to work.\n");
6933 queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ);
6934 return 0;
6935 }
6936
6937 if (ipw_up(priv))
6938 return -EIO; 10869 return -EIO;
10870 }
6939 10871
10872 up(&priv->sem);
6940 return 0; 10873 return 0;
6941} 10874}
6942 10875
@@ -6961,7 +10894,7 @@ static struct pci_device_id card_ids[] = {
6961 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2762, 0, 0, 0}, 10894 {PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, 0x2762, 0, 0, 0},
6962 {PCI_VENDOR_ID_INTEL, 0x104f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 10895 {PCI_VENDOR_ID_INTEL, 0x104f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
6963 {PCI_VENDOR_ID_INTEL, 0x4220, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */ 10896 {PCI_VENDOR_ID_INTEL, 0x4220, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
6964 {PCI_VENDOR_ID_INTEL, 0x4221, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* 2225BG */ 10897 {PCI_VENDOR_ID_INTEL, 0x4221, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* BG */
6965 {PCI_VENDOR_ID_INTEL, 0x4223, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */ 10898 {PCI_VENDOR_ID_INTEL, 0x4223, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
6966 {PCI_VENDOR_ID_INTEL, 0x4224, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */ 10899 {PCI_VENDOR_ID_INTEL, 0x4224, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* ABG */
6967 10900
@@ -6981,11 +10914,16 @@ static struct attribute *ipw_sysfs_entries[] = {
6981 &dev_attr_nic_type.attr, 10914 &dev_attr_nic_type.attr,
6982 &dev_attr_status.attr, 10915 &dev_attr_status.attr,
6983 &dev_attr_cfg.attr, 10916 &dev_attr_cfg.attr,
6984 &dev_attr_dump_errors.attr, 10917 &dev_attr_error.attr,
6985 &dev_attr_dump_events.attr, 10918 &dev_attr_event_log.attr,
10919 &dev_attr_cmd_log.attr,
6986 &dev_attr_eeprom_delay.attr, 10920 &dev_attr_eeprom_delay.attr,
6987 &dev_attr_ucode_version.attr, 10921 &dev_attr_ucode_version.attr,
6988 &dev_attr_rtc.attr, 10922 &dev_attr_rtc.attr,
10923 &dev_attr_scan_age.attr,
10924 &dev_attr_led.attr,
10925 &dev_attr_speed_scan.attr,
10926 &dev_attr_net_stats.attr,
6989 NULL 10927 NULL
6990}; 10928};
6991 10929
@@ -7001,7 +10939,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7001 void __iomem *base; 10939 void __iomem *base;
7002 u32 length, val; 10940 u32 length, val;
7003 struct ipw_priv *priv; 10941 struct ipw_priv *priv;
7004 int band, modulation; 10942 int i;
7005 10943
7006 net_dev = alloc_ieee80211(sizeof(struct ipw_priv)); 10944 net_dev = alloc_ieee80211(sizeof(struct ipw_priv));
7007 if (net_dev == NULL) { 10945 if (net_dev == NULL) {
@@ -7011,13 +10949,17 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7011 10949
7012 priv = ieee80211_priv(net_dev); 10950 priv = ieee80211_priv(net_dev);
7013 priv->ieee = netdev_priv(net_dev); 10951 priv->ieee = netdev_priv(net_dev);
10952
7014 priv->net_dev = net_dev; 10953 priv->net_dev = net_dev;
7015 priv->pci_dev = pdev; 10954 priv->pci_dev = pdev;
7016#ifdef CONFIG_IPW_DEBUG 10955#ifdef CONFIG_IPW_DEBUG
7017 ipw_debug_level = debug; 10956 ipw_debug_level = debug;
7018#endif 10957#endif
7019 spin_lock_init(&priv->lock); 10958 spin_lock_init(&priv->lock);
10959 for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++)
10960 INIT_LIST_HEAD(&priv->ibss_mac_hash[i]);
7020 10961
10962 init_MUTEX(&priv->sem);
7021 if (pci_enable_device(pdev)) { 10963 if (pci_enable_device(pdev)) {
7022 err = -ENODEV; 10964 err = -ENODEV;
7023 goto out_free_ieee80211; 10965 goto out_free_ieee80211;
@@ -7064,90 +11006,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7064 goto out_iounmap; 11006 goto out_iounmap;
7065 } 11007 }
7066 11008
7067 /* Initialize module parameter values here */ 11009 ipw_sw_reset(priv, 1);
7068 if (ifname)
7069 strncpy(net_dev->name, ifname, IFNAMSIZ);
7070
7071 if (associate)
7072 priv->config |= CFG_ASSOCIATE;
7073 else
7074 IPW_DEBUG_INFO("Auto associate disabled.\n");
7075
7076 if (auto_create)
7077 priv->config |= CFG_ADHOC_CREATE;
7078 else
7079 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
7080
7081 if (disable) {
7082 priv->status |= STATUS_RF_KILL_SW;
7083 IPW_DEBUG_INFO("Radio disabled.\n");
7084 }
7085
7086 if (channel != 0) {
7087 priv->config |= CFG_STATIC_CHANNEL;
7088 priv->channel = channel;
7089 IPW_DEBUG_INFO("Bind to static channel %d\n", channel);
7090 IPW_DEBUG_INFO("Bind to static channel %d\n", channel);
7091 /* TODO: Validate that provided channel is in range */
7092 }
7093
7094 switch (mode) {
7095 case 1:
7096 priv->ieee->iw_mode = IW_MODE_ADHOC;
7097 break;
7098#ifdef CONFIG_IPW_PROMISC
7099 case 2:
7100 priv->ieee->iw_mode = IW_MODE_MONITOR;
7101 break;
7102#endif
7103 default:
7104 case 0:
7105 priv->ieee->iw_mode = IW_MODE_INFRA;
7106 break;
7107 }
7108
7109 if ((priv->pci_dev->device == 0x4223) ||
7110 (priv->pci_dev->device == 0x4224)) {
7111 printk(KERN_INFO DRV_NAME
7112 ": Detected Intel PRO/Wireless 2915ABG Network "
7113 "Connection\n");
7114 priv->ieee->abg_true = 1;
7115 band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND;
7116 modulation = IEEE80211_OFDM_MODULATION |
7117 IEEE80211_CCK_MODULATION;
7118 priv->adapter = IPW_2915ABG;
7119 priv->ieee->mode = IEEE_A | IEEE_G | IEEE_B;
7120 } else {
7121 if (priv->pci_dev->device == 0x4221)
7122 printk(KERN_INFO DRV_NAME
7123 ": Detected Intel PRO/Wireless 2225BG Network "
7124 "Connection\n");
7125 else
7126 printk(KERN_INFO DRV_NAME
7127 ": Detected Intel PRO/Wireless 2200BG Network "
7128 "Connection\n");
7129
7130 priv->ieee->abg_true = 0;
7131 band = IEEE80211_24GHZ_BAND;
7132 modulation = IEEE80211_OFDM_MODULATION |
7133 IEEE80211_CCK_MODULATION;
7134 priv->adapter = IPW_2200BG;
7135 priv->ieee->mode = IEEE_G | IEEE_B;
7136 }
7137
7138 priv->ieee->freq_band = band;
7139 priv->ieee->modulation = modulation;
7140
7141 priv->rates_mask = IEEE80211_DEFAULT_RATES_MASK;
7142
7143 priv->missed_beacon_threshold = IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT;
7144 priv->roaming_threshold = IPW_MB_ROAMING_THRESHOLD_DEFAULT;
7145
7146 priv->rts_threshold = DEFAULT_RTS_THRESHOLD;
7147
7148 /* If power management is turned on, default to AC mode */
7149 priv->power_mode = IPW_POWER_AC;
7150 priv->tx_power = IPW_DEFAULT_TX_POWER;
7151 11010
7152 err = request_irq(pdev->irq, ipw_isr, SA_SHIRQ, DRV_NAME, priv); 11011 err = request_irq(pdev->irq, ipw_isr, SA_SHIRQ, DRV_NAME, priv);
7153 if (err) { 11012 if (err) {
@@ -7158,8 +11017,20 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7158 SET_MODULE_OWNER(net_dev); 11017 SET_MODULE_OWNER(net_dev);
7159 SET_NETDEV_DEV(net_dev, &pdev->dev); 11018 SET_NETDEV_DEV(net_dev, &pdev->dev);
7160 11019
11020 down(&priv->sem);
11021
7161 priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit; 11022 priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit;
7162 priv->ieee->set_security = shim__set_security; 11023 priv->ieee->set_security = shim__set_security;
11024 priv->ieee->is_queue_full = ipw_net_is_queue_full;
11025
11026#ifdef CONFIG_IPW_QOS
11027 priv->ieee->handle_probe_response = ipw_handle_beacon;
11028 priv->ieee->handle_beacon = ipw_handle_probe_response;
11029 priv->ieee->handle_assoc_response = ipw_handle_assoc_response;
11030#endif /* CONFIG_IPW_QOS */
11031
11032 priv->ieee->perfect_rssi = -20;
11033 priv->ieee->worst_rssi = -85;
7163 11034
7164 net_dev->open = ipw_net_open; 11035 net_dev->open = ipw_net_open;
7165 net_dev->stop = ipw_net_stop; 11036 net_dev->stop = ipw_net_stop;
@@ -7167,7 +11038,9 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7167 net_dev->get_stats = ipw_net_get_stats; 11038 net_dev->get_stats = ipw_net_get_stats;
7168 net_dev->set_multicast_list = ipw_net_set_multicast_list; 11039 net_dev->set_multicast_list = ipw_net_set_multicast_list;
7169 net_dev->set_mac_address = ipw_net_set_mac_address; 11040 net_dev->set_mac_address = ipw_net_set_mac_address;
7170 net_dev->get_wireless_stats = ipw_get_wireless_stats; 11041 priv->wireless_data.spy_data = &priv->ieee->spy_data;
11042 priv->wireless_data.ieee80211 = priv->ieee;
11043 net_dev->wireless_data = &priv->wireless_data;
7171 net_dev->wireless_handlers = &ipw_wx_handler_def; 11044 net_dev->wireless_handlers = &ipw_wx_handler_def;
7172 net_dev->ethtool_ops = &ipw_ethtool_ops; 11045 net_dev->ethtool_ops = &ipw_ethtool_ops;
7173 net_dev->irq = pdev->irq; 11046 net_dev->irq = pdev->irq;
@@ -7178,18 +11051,19 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7178 err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); 11051 err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group);
7179 if (err) { 11052 if (err) {
7180 IPW_ERROR("failed to create sysfs device attributes\n"); 11053 IPW_ERROR("failed to create sysfs device attributes\n");
11054 up(&priv->sem);
7181 goto out_release_irq; 11055 goto out_release_irq;
7182 } 11056 }
7183 11057
11058 up(&priv->sem);
7184 err = register_netdev(net_dev); 11059 err = register_netdev(net_dev);
7185 if (err) { 11060 if (err) {
7186 IPW_ERROR("failed to register network device\n"); 11061 IPW_ERROR("failed to register network device\n");
7187 goto out_remove_group; 11062 goto out_remove_sysfs;
7188 } 11063 }
7189
7190 return 0; 11064 return 0;
7191 11065
7192 out_remove_group: 11066 out_remove_sysfs:
7193 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); 11067 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
7194 out_release_irq: 11068 out_release_irq:
7195 free_irq(pdev->irq, priv); 11069 free_irq(pdev->irq, priv);
@@ -7212,14 +11086,19 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7212static void ipw_pci_remove(struct pci_dev *pdev) 11086static void ipw_pci_remove(struct pci_dev *pdev)
7213{ 11087{
7214 struct ipw_priv *priv = pci_get_drvdata(pdev); 11088 struct ipw_priv *priv = pci_get_drvdata(pdev);
11089 struct list_head *p, *q;
11090 int i;
11091
7215 if (!priv) 11092 if (!priv)
7216 return; 11093 return;
7217 11094
7218 priv->status |= STATUS_EXIT_PENDING; 11095 down(&priv->sem);
7219 11096
11097 priv->status |= STATUS_EXIT_PENDING;
11098 ipw_down(priv);
7220 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); 11099 sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);
7221 11100
7222 ipw_down(priv); 11101 up(&priv->sem);
7223 11102
7224 unregister_netdev(priv->net_dev); 11103 unregister_netdev(priv->net_dev);
7225 11104
@@ -7229,16 +11108,31 @@ static void ipw_pci_remove(struct pci_dev *pdev)
7229 } 11108 }
7230 ipw_tx_queue_free(priv); 11109 ipw_tx_queue_free(priv);
7231 11110
11111 if (priv->cmdlog) {
11112 kfree(priv->cmdlog);
11113 priv->cmdlog = NULL;
11114 }
7232 /* ipw_down will ensure that there is no more pending work 11115 /* ipw_down will ensure that there is no more pending work
7233 * in the workqueue's, so we can safely remove them now. */ 11116 * in the workqueue's, so we can safely remove them now. */
7234 if (priv->workqueue) { 11117 cancel_delayed_work(&priv->adhoc_check);
7235 cancel_delayed_work(&priv->adhoc_check); 11118 cancel_delayed_work(&priv->gather_stats);
7236 cancel_delayed_work(&priv->gather_stats); 11119 cancel_delayed_work(&priv->request_scan);
7237 cancel_delayed_work(&priv->request_scan); 11120 cancel_delayed_work(&priv->rf_kill);
7238 cancel_delayed_work(&priv->rf_kill); 11121 cancel_delayed_work(&priv->scan_check);
7239 cancel_delayed_work(&priv->scan_check); 11122 destroy_workqueue(priv->workqueue);
7240 destroy_workqueue(priv->workqueue); 11123 priv->workqueue = NULL;
7241 priv->workqueue = NULL; 11124
11125 /* Free MAC hash list for ADHOC */
11126 for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) {
11127 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) {
11128 kfree(list_entry(p, struct ipw_ibss_seq, list));
11129 list_del(p);
11130 }
11131 }
11132
11133 if (priv->error) {
11134 ipw_free_error_log(priv->error);
11135 priv->error = NULL;
7242 } 11136 }
7243 11137
7244 free_irq(pdev->irq, priv); 11138 free_irq(pdev->irq, priv);
@@ -7247,15 +11141,7 @@ static void ipw_pci_remove(struct pci_dev *pdev)
7247 pci_disable_device(pdev); 11141 pci_disable_device(pdev);
7248 pci_set_drvdata(pdev, NULL); 11142 pci_set_drvdata(pdev, NULL);
7249 free_ieee80211(priv->net_dev); 11143 free_ieee80211(priv->net_dev);
7250 11144 free_firmware();
7251#ifdef CONFIG_PM
7252 if (fw_loaded) {
7253 release_firmware(bootfw);
7254 release_firmware(ucode);
7255 release_firmware(firmware);
7256 fw_loaded = 0;
7257 }
7258#endif
7259} 11145}
7260 11146
7261#ifdef CONFIG_PM 11147#ifdef CONFIG_PM
@@ -7287,13 +11173,10 @@ static int ipw_pci_resume(struct pci_dev *pdev)
7287 11173
7288 printk(KERN_INFO "%s: Coming out of suspend...\n", dev->name); 11174 printk(KERN_INFO "%s: Coming out of suspend...\n", dev->name);
7289 11175
7290 pci_set_power_state(pdev, 0); 11176 pci_set_power_state(pdev, PCI_D0);
7291 pci_enable_device(pdev); 11177 pci_enable_device(pdev);
7292#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
7293 pci_restore_state(pdev, priv->pm_state);
7294#else
7295 pci_restore_state(pdev); 11178 pci_restore_state(pdev);
7296#endif 11179
7297 /* 11180 /*
7298 * Suspend/Resume resets the PCI configuration space, so we have to 11181 * Suspend/Resume resets the PCI configuration space, so we have to
7299 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries 11182 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
@@ -7365,16 +11248,33 @@ MODULE_PARM_DESC(associate, "auto associate when scanning (default on)");
7365module_param(auto_create, int, 0444); 11248module_param(auto_create, int, 0444);
7366MODULE_PARM_DESC(auto_create, "auto create adhoc network (default on)"); 11249MODULE_PARM_DESC(auto_create, "auto create adhoc network (default on)");
7367 11250
11251module_param(led, int, 0444);
11252MODULE_PARM_DESC(led, "enable led control on some systems (default 0 off)\n");
11253
7368module_param(debug, int, 0444); 11254module_param(debug, int, 0444);
7369MODULE_PARM_DESC(debug, "debug output mask"); 11255MODULE_PARM_DESC(debug, "debug output mask");
7370 11256
7371module_param(channel, int, 0444); 11257module_param(channel, int, 0444);
7372MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])"); 11258MODULE_PARM_DESC(channel, "channel to limit associate to (default 0 [ANY])");
7373 11259
7374module_param(ifname, charp, 0444); 11260#ifdef CONFIG_IPW_QOS
7375MODULE_PARM_DESC(ifname, "network device name (default eth%d)"); 11261module_param(qos_enable, int, 0444);
11262MODULE_PARM_DESC(qos_enable, "enable all QoS functionalitis");
11263
11264module_param(qos_burst_enable, int, 0444);
11265MODULE_PARM_DESC(qos_burst_enable, "enable QoS burst mode");
11266
11267module_param(qos_no_ack_mask, int, 0444);
11268MODULE_PARM_DESC(qos_no_ack_mask, "mask Tx_Queue to no ack");
7376 11269
7377#ifdef CONFIG_IPW_PROMISC 11270module_param(burst_duration_CCK, int, 0444);
11271MODULE_PARM_DESC(burst_duration_CCK, "set CCK burst value");
11272
11273module_param(burst_duration_OFDM, int, 0444);
11274MODULE_PARM_DESC(burst_duration_OFDM, "set OFDM burst value");
11275#endif /* CONFIG_IPW_QOS */
11276
11277#ifdef CONFIG_IPW2200_MONITOR
7378module_param(mode, int, 0444); 11278module_param(mode, int, 0444);
7379MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)"); 11279MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
7380#else 11280#else
@@ -7382,5 +11282,12 @@ module_param(mode, int, 0444);
7382MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)"); 11282MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)");
7383#endif 11283#endif
7384 11284
11285module_param(hwcrypto, int, 0444);
11286MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default on)");
11287
11288module_param(cmdlog, int, 0444);
11289MODULE_PARM_DESC(cmdlog,
11290 "allocate a ring buffer for logging firmware commands");
11291
7385module_exit(ipw_exit); 11292module_exit(ipw_exit);
7386module_init(ipw_init); 11293module_init(ipw_init);
diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h
index e9cf32bf3e31..617ec4dba17a 100644
--- a/drivers/net/wireless/ipw2200.h
+++ b/drivers/net/wireless/ipw2200.h
@@ -1,6 +1,6 @@
1/****************************************************************************** 1/******************************************************************************
2 2
3 Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved. 3 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
4 4
5 This program is free software; you can redistribute it and/or modify it 5 This program is free software; you can redistribute it and/or modify it
6 under the terms of version 2 of the GNU General Public License as 6 under the terms of version 2 of the GNU General Public License as
@@ -50,6 +50,7 @@
50#include <asm/io.h> 50#include <asm/io.h>
51 51
52#include <net/ieee80211.h> 52#include <net/ieee80211.h>
53#include <net/ieee80211_radiotap.h>
53 54
54#define DRV_NAME "ipw2200" 55#define DRV_NAME "ipw2200"
55 56
@@ -161,6 +162,16 @@ enum connection_manager_assoc_states {
161 * TX Queue Flag Definitions 162 * TX Queue Flag Definitions
162 */ 163 */
163 164
165/* tx wep key definition */
166#define DCT_WEP_KEY_NOT_IMMIDIATE 0x00
167#define DCT_WEP_KEY_64Bit 0x40
168#define DCT_WEP_KEY_128Bit 0x80
169#define DCT_WEP_KEY_128bitIV 0xC0
170#define DCT_WEP_KEY_SIZE_MASK 0xC0
171
172#define DCT_WEP_KEY_INDEX_MASK 0x0F
173#define DCT_WEP_INDEX_USE_IMMEDIATE 0x20
174
164/* abort attempt if mgmt frame is rx'd */ 175/* abort attempt if mgmt frame is rx'd */
165#define DCT_FLAG_ABORT_MGMT 0x01 176#define DCT_FLAG_ABORT_MGMT 0x01
166 177
@@ -168,7 +179,8 @@ enum connection_manager_assoc_states {
168#define DCT_FLAG_CTS_REQUIRED 0x02 179#define DCT_FLAG_CTS_REQUIRED 0x02
169 180
170/* use short preamble */ 181/* use short preamble */
171#define DCT_FLAG_SHORT_PREMBL 0x04 182#define DCT_FLAG_LONG_PREAMBLE 0x00
183#define DCT_FLAG_SHORT_PREAMBLE 0x04
172 184
173/* RTS/CTS first */ 185/* RTS/CTS first */
174#define DCT_FLAG_RTS_REQD 0x08 186#define DCT_FLAG_RTS_REQD 0x08
@@ -185,9 +197,23 @@ enum connection_manager_assoc_states {
185/* ACK rx is expected to follow */ 197/* ACK rx is expected to follow */
186#define DCT_FLAG_ACK_REQD 0x80 198#define DCT_FLAG_ACK_REQD 0x80
187 199
200/* TX flags extension */
188#define DCT_FLAG_EXT_MODE_CCK 0x01 201#define DCT_FLAG_EXT_MODE_CCK 0x01
189#define DCT_FLAG_EXT_MODE_OFDM 0x00 202#define DCT_FLAG_EXT_MODE_OFDM 0x00
190 203
204#define DCT_FLAG_EXT_SECURITY_WEP 0x00
205#define DCT_FLAG_EXT_SECURITY_NO DCT_FLAG_EXT_SECURITY_WEP
206#define DCT_FLAG_EXT_SECURITY_CKIP 0x04
207#define DCT_FLAG_EXT_SECURITY_CCM 0x08
208#define DCT_FLAG_EXT_SECURITY_TKIP 0x0C
209#define DCT_FLAG_EXT_SECURITY_MASK 0x0C
210
211#define DCT_FLAG_EXT_QOS_ENABLED 0x10
212
213#define DCT_FLAG_EXT_HC_NO_SIFS_PIFS 0x00
214#define DCT_FLAG_EXT_HC_SIFS 0x20
215#define DCT_FLAG_EXT_HC_PIFS 0x40
216
191#define TX_RX_TYPE_MASK 0xFF 217#define TX_RX_TYPE_MASK 0xFF
192#define TX_FRAME_TYPE 0x00 218#define TX_FRAME_TYPE 0x00
193#define TX_HOST_COMMAND_TYPE 0x01 219#define TX_HOST_COMMAND_TYPE 0x01
@@ -233,6 +259,117 @@ enum connection_manager_assoc_states {
233#define DCR_TYPE_SNIFFER 0x06 259#define DCR_TYPE_SNIFFER 0x06
234#define DCR_TYPE_MU_BSS DCR_TYPE_MU_ESS 260#define DCR_TYPE_MU_BSS DCR_TYPE_MU_ESS
235 261
262/* QoS definitions */
263
264#define CW_MIN_OFDM 15
265#define CW_MAX_OFDM 1023
266#define CW_MIN_CCK 31
267#define CW_MAX_CCK 1023
268
269#define QOS_TX0_CW_MIN_OFDM CW_MIN_OFDM
270#define QOS_TX1_CW_MIN_OFDM CW_MIN_OFDM
271#define QOS_TX2_CW_MIN_OFDM ( (CW_MIN_OFDM + 1) / 2 - 1 )
272#define QOS_TX3_CW_MIN_OFDM ( (CW_MIN_OFDM + 1) / 4 - 1 )
273
274#define QOS_TX0_CW_MIN_CCK CW_MIN_CCK
275#define QOS_TX1_CW_MIN_CCK CW_MIN_CCK
276#define QOS_TX2_CW_MIN_CCK ( (CW_MIN_CCK + 1) / 2 - 1 )
277#define QOS_TX3_CW_MIN_CCK ( (CW_MIN_CCK + 1) / 4 - 1 )
278
279#define QOS_TX0_CW_MAX_OFDM CW_MAX_OFDM
280#define QOS_TX1_CW_MAX_OFDM CW_MAX_OFDM
281#define QOS_TX2_CW_MAX_OFDM CW_MIN_OFDM
282#define QOS_TX3_CW_MAX_OFDM ( (CW_MIN_OFDM + 1) / 2 - 1 )
283
284#define QOS_TX0_CW_MAX_CCK CW_MAX_CCK
285#define QOS_TX1_CW_MAX_CCK CW_MAX_CCK
286#define QOS_TX2_CW_MAX_CCK CW_MIN_CCK
287#define QOS_TX3_CW_MAX_CCK ( (CW_MIN_CCK + 1) / 2 - 1 )
288
289#define QOS_TX0_AIFS (3 - QOS_AIFSN_MIN_VALUE)
290#define QOS_TX1_AIFS (7 - QOS_AIFSN_MIN_VALUE)
291#define QOS_TX2_AIFS (2 - QOS_AIFSN_MIN_VALUE)
292#define QOS_TX3_AIFS (2 - QOS_AIFSN_MIN_VALUE)
293
294#define QOS_TX0_ACM 0
295#define QOS_TX1_ACM 0
296#define QOS_TX2_ACM 0
297#define QOS_TX3_ACM 0
298
299#define QOS_TX0_TXOP_LIMIT_CCK 0
300#define QOS_TX1_TXOP_LIMIT_CCK 0
301#define QOS_TX2_TXOP_LIMIT_CCK 6016
302#define QOS_TX3_TXOP_LIMIT_CCK 3264
303
304#define QOS_TX0_TXOP_LIMIT_OFDM 0
305#define QOS_TX1_TXOP_LIMIT_OFDM 0
306#define QOS_TX2_TXOP_LIMIT_OFDM 3008
307#define QOS_TX3_TXOP_LIMIT_OFDM 1504
308
309#define DEF_TX0_CW_MIN_OFDM CW_MIN_OFDM
310#define DEF_TX1_CW_MIN_OFDM CW_MIN_OFDM
311#define DEF_TX2_CW_MIN_OFDM CW_MIN_OFDM
312#define DEF_TX3_CW_MIN_OFDM CW_MIN_OFDM
313
314#define DEF_TX0_CW_MIN_CCK CW_MIN_CCK
315#define DEF_TX1_CW_MIN_CCK CW_MIN_CCK
316#define DEF_TX2_CW_MIN_CCK CW_MIN_CCK
317#define DEF_TX3_CW_MIN_CCK CW_MIN_CCK
318
319#define DEF_TX0_CW_MAX_OFDM CW_MAX_OFDM
320#define DEF_TX1_CW_MAX_OFDM CW_MAX_OFDM
321#define DEF_TX2_CW_MAX_OFDM CW_MAX_OFDM
322#define DEF_TX3_CW_MAX_OFDM CW_MAX_OFDM
323
324#define DEF_TX0_CW_MAX_CCK CW_MAX_CCK
325#define DEF_TX1_CW_MAX_CCK CW_MAX_CCK
326#define DEF_TX2_CW_MAX_CCK CW_MAX_CCK
327#define DEF_TX3_CW_MAX_CCK CW_MAX_CCK
328
329#define DEF_TX0_AIFS 0
330#define DEF_TX1_AIFS 0
331#define DEF_TX2_AIFS 0
332#define DEF_TX3_AIFS 0
333
334#define DEF_TX0_ACM 0
335#define DEF_TX1_ACM 0
336#define DEF_TX2_ACM 0
337#define DEF_TX3_ACM 0
338
339#define DEF_TX0_TXOP_LIMIT_CCK 0
340#define DEF_TX1_TXOP_LIMIT_CCK 0
341#define DEF_TX2_TXOP_LIMIT_CCK 0
342#define DEF_TX3_TXOP_LIMIT_CCK 0
343
344#define DEF_TX0_TXOP_LIMIT_OFDM 0
345#define DEF_TX1_TXOP_LIMIT_OFDM 0
346#define DEF_TX2_TXOP_LIMIT_OFDM 0
347#define DEF_TX3_TXOP_LIMIT_OFDM 0
348
349#define QOS_QOS_SETS 3
350#define QOS_PARAM_SET_ACTIVE 0
351#define QOS_PARAM_SET_DEF_CCK 1
352#define QOS_PARAM_SET_DEF_OFDM 2
353
354#define CTRL_QOS_NO_ACK (0x0020)
355
356#define IPW_TX_QUEUE_1 1
357#define IPW_TX_QUEUE_2 2
358#define IPW_TX_QUEUE_3 3
359#define IPW_TX_QUEUE_4 4
360
361/* QoS sturctures */
362struct ipw_qos_info {
363 int qos_enable;
364 struct ieee80211_qos_parameters *def_qos_parm_OFDM;
365 struct ieee80211_qos_parameters *def_qos_parm_CCK;
366 u32 burst_duration_CCK;
367 u32 burst_duration_OFDM;
368 u16 qos_no_ack_mask;
369 int burst_enable;
370};
371
372/**************************************************************/
236/** 373/**
237 * Generic queue structure 374 * Generic queue structure
238 * 375 *
@@ -402,9 +539,9 @@ struct clx2_tx_queue {
402#define RX_FREE_BUFFERS 32 539#define RX_FREE_BUFFERS 32
403#define RX_LOW_WATERMARK 8 540#define RX_LOW_WATERMARK 8
404 541
405#define SUP_RATE_11A_MAX_NUM_CHANNELS (8) 542#define SUP_RATE_11A_MAX_NUM_CHANNELS 8
406#define SUP_RATE_11B_MAX_NUM_CHANNELS (4) 543#define SUP_RATE_11B_MAX_NUM_CHANNELS 4
407#define SUP_RATE_11G_MAX_NUM_CHANNELS (12) 544#define SUP_RATE_11G_MAX_NUM_CHANNELS 12
408 545
409// Used for passing to driver number of successes and failures per rate 546// Used for passing to driver number of successes and failures per rate
410struct rate_histogram { 547struct rate_histogram {
@@ -453,6 +590,9 @@ struct notif_channel_result {
453 u8 uReserved; 590 u8 uReserved;
454} __attribute__ ((packed)); 591} __attribute__ ((packed));
455 592
593#define SCAN_COMPLETED_STATUS_COMPLETE 1
594#define SCAN_COMPLETED_STATUS_ABORTED 2
595
456struct notif_scan_complete { 596struct notif_scan_complete {
457 u8 scan_type; 597 u8 scan_type;
458 u8 num_channels; 598 u8 num_channels;
@@ -563,8 +703,8 @@ struct ipw_rx_packet {
563} __attribute__ ((packed)); 703} __attribute__ ((packed));
564 704
565#define IPW_RX_NOTIFICATION_SIZE sizeof(struct ipw_rx_header) + 12 705#define IPW_RX_NOTIFICATION_SIZE sizeof(struct ipw_rx_header) + 12
566#define IPW_RX_FRAME_SIZE sizeof(struct ipw_rx_header) + \ 706#define IPW_RX_FRAME_SIZE (unsigned int)(sizeof(struct ipw_rx_header) + \
567 sizeof(struct ipw_rx_frame) 707 sizeof(struct ipw_rx_frame))
568 708
569struct ipw_rx_mem_buffer { 709struct ipw_rx_mem_buffer {
570 dma_addr_t dma_addr; 710 dma_addr_t dma_addr;
@@ -657,6 +797,19 @@ struct ipw_multicast_addr {
657 u8 mac4[6]; 797 u8 mac4[6];
658} __attribute__ ((packed)); 798} __attribute__ ((packed));
659 799
800#define DCW_WEP_KEY_INDEX_MASK 0x03 /* bits [0:1] */
801#define DCW_WEP_KEY_SEC_TYPE_MASK 0x30 /* bits [4:5] */
802
803#define DCW_WEP_KEY_SEC_TYPE_WEP 0x00
804#define DCW_WEP_KEY_SEC_TYPE_CCM 0x20
805#define DCW_WEP_KEY_SEC_TYPE_TKIP 0x30
806
807#define DCW_WEP_KEY_INVALID_SIZE 0x00 /* 0 = Invalid key */
808#define DCW_WEP_KEY64Bit_SIZE 0x05 /* 64-bit encryption */
809#define DCW_WEP_KEY128Bit_SIZE 0x0D /* 128-bit encryption */
810#define DCW_CCM_KEY128Bit_SIZE 0x10 /* 128-bit key */
811//#define DCW_WEP_KEY128BitIV_SIZE 0x10 /* 128-bit key and 128-bit IV */
812
660struct ipw_wep_key { 813struct ipw_wep_key {
661 u8 cmd_id; 814 u8 cmd_id;
662 u8 seq_num; 815 u8 seq_num;
@@ -818,14 +971,6 @@ struct ipw_tx_power {
818 struct ipw_channel_tx_power channels_tx_power[MAX_A_CHANNELS]; 971 struct ipw_channel_tx_power channels_tx_power[MAX_A_CHANNELS];
819} __attribute__ ((packed)); 972} __attribute__ ((packed));
820 973
821struct ipw_qos_parameters {
822 u16 cw_min[4];
823 u16 cw_max[4];
824 u8 aifs[4];
825 u8 flag[4];
826 u16 tx_op_limit[4];
827} __attribute__ ((packed));
828
829struct ipw_rsn_capabilities { 974struct ipw_rsn_capabilities {
830 u8 id; 975 u8 id;
831 u8 length; 976 u8 length;
@@ -888,6 +1033,10 @@ struct ipw_cmd {
888#define STATUS_SCAN_PENDING (1<<20) 1033#define STATUS_SCAN_PENDING (1<<20)
889#define STATUS_SCANNING (1<<21) 1034#define STATUS_SCANNING (1<<21)
890#define STATUS_SCAN_ABORTING (1<<22) 1035#define STATUS_SCAN_ABORTING (1<<22)
1036#define STATUS_SCAN_FORCED (1<<23)
1037
1038#define STATUS_LED_LINK_ON (1<<24)
1039#define STATUS_LED_ACT_ON (1<<25)
891 1040
892#define STATUS_INDIRECT_BYTE (1<<28) /* sysfs entry configured for access */ 1041#define STATUS_INDIRECT_BYTE (1<<28) /* sysfs entry configured for access */
893#define STATUS_INDIRECT_DWORD (1<<29) /* sysfs entry configured for access */ 1042#define STATUS_INDIRECT_DWORD (1<<29) /* sysfs entry configured for access */
@@ -899,11 +1048,15 @@ struct ipw_cmd {
899#define CFG_STATIC_ESSID (1<<1) /* Restrict assoc. to single SSID */ 1048#define CFG_STATIC_ESSID (1<<1) /* Restrict assoc. to single SSID */
900#define CFG_STATIC_BSSID (1<<2) /* Restrict assoc. to single BSSID */ 1049#define CFG_STATIC_BSSID (1<<2) /* Restrict assoc. to single BSSID */
901#define CFG_CUSTOM_MAC (1<<3) 1050#define CFG_CUSTOM_MAC (1<<3)
902#define CFG_PREAMBLE (1<<4) 1051#define CFG_PREAMBLE_LONG (1<<4)
903#define CFG_ADHOC_PERSIST (1<<5) 1052#define CFG_ADHOC_PERSIST (1<<5)
904#define CFG_ASSOCIATE (1<<6) 1053#define CFG_ASSOCIATE (1<<6)
905#define CFG_FIXED_RATE (1<<7) 1054#define CFG_FIXED_RATE (1<<7)
906#define CFG_ADHOC_CREATE (1<<8) 1055#define CFG_ADHOC_CREATE (1<<8)
1056#define CFG_NO_LED (1<<9)
1057#define CFG_BACKGROUND_SCAN (1<<10)
1058#define CFG_SPEED_SCAN (1<<11)
1059#define CFG_NET_STATS (1<<12)
907 1060
908#define CAP_SHARED_KEY (1<<0) /* Off = OPEN */ 1061#define CAP_SHARED_KEY (1<<0) /* Off = OPEN */
909#define CAP_PRIVACY_ON (1<<1) /* Off = No privacy */ 1062#define CAP_PRIVACY_ON (1<<1) /* Off = No privacy */
@@ -925,13 +1078,50 @@ struct average {
925 s32 sum; 1078 s32 sum;
926}; 1079};
927 1080
1081#define MAX_SPEED_SCAN 100
1082#define IPW_IBSS_MAC_HASH_SIZE 31
1083
1084struct ipw_ibss_seq {
1085 u8 mac[ETH_ALEN];
1086 u16 seq_num;
1087 u16 frag_num;
1088 unsigned long packet_time;
1089 struct list_head list;
1090};
1091
1092struct ipw_error_elem {
1093 u32 desc;
1094 u32 time;
1095 u32 blink1;
1096 u32 blink2;
1097 u32 link1;
1098 u32 link2;
1099 u32 data;
1100};
1101
1102struct ipw_event {
1103 u32 event;
1104 u32 time;
1105 u32 data;
1106} __attribute__ ((packed));
1107
1108struct ipw_fw_error {
1109 unsigned long jiffies;
1110 u32 status;
1111 u32 config;
1112 u32 elem_len;
1113 u32 log_len;
1114 struct ipw_error_elem *elem;
1115 struct ipw_event *log;
1116 u8 payload[0];
1117} __attribute__ ((packed));
1118
928struct ipw_priv { 1119struct ipw_priv {
929 /* ieee device used by generic ieee processing code */ 1120 /* ieee device used by generic ieee processing code */
930 struct ieee80211_device *ieee; 1121 struct ieee80211_device *ieee;
931 struct ieee80211_security sec;
932 1122
933 /* spinlock */
934 spinlock_t lock; 1123 spinlock_t lock;
1124 struct semaphore sem;
935 1125
936 /* basic pci-network driver stuff */ 1126 /* basic pci-network driver stuff */
937 struct pci_dev *pci_dev; 1127 struct pci_dev *pci_dev;
@@ -966,7 +1156,7 @@ struct ipw_priv {
966 int rx_bufs_min; /**< minimum number of bufs in Rx queue */ 1156 int rx_bufs_min; /**< minimum number of bufs in Rx queue */
967 int rx_pend_max; /**< maximum pending buffers for one IRQ */ 1157 int rx_pend_max; /**< maximum pending buffers for one IRQ */
968 u32 hcmd_seq; /**< sequence number for hcmd */ 1158 u32 hcmd_seq; /**< sequence number for hcmd */
969 u32 missed_beacon_threshold; 1159 u32 disassociate_threshold;
970 u32 roaming_threshold; 1160 u32 roaming_threshold;
971 1161
972 struct ipw_associate assoc_request; 1162 struct ipw_associate assoc_request;
@@ -1007,6 +1197,8 @@ struct ipw_priv {
1007 u8 mac_addr[ETH_ALEN]; 1197 u8 mac_addr[ETH_ALEN];
1008 u8 num_stations; 1198 u8 num_stations;
1009 u8 stations[MAX_STATIONS][ETH_ALEN]; 1199 u8 stations[MAX_STATIONS][ETH_ALEN];
1200 u8 short_retry_limit;
1201 u8 long_retry_limit;
1010 1202
1011 u32 notif_missed_beacons; 1203 u32 notif_missed_beacons;
1012 1204
@@ -1024,17 +1216,29 @@ struct ipw_priv {
1024 u32 tx_packets; 1216 u32 tx_packets;
1025 u32 quality; 1217 u32 quality;
1026 1218
1219 u8 speed_scan[MAX_SPEED_SCAN];
1220 u8 speed_scan_pos;
1221
1222 u16 last_seq_num;
1223 u16 last_frag_num;
1224 unsigned long last_packet_time;
1225 struct list_head ibss_mac_hash[IPW_IBSS_MAC_HASH_SIZE];
1226
1027 /* eeprom */ 1227 /* eeprom */
1028 u8 eeprom[0x100]; /* 256 bytes of eeprom */ 1228 u8 eeprom[0x100]; /* 256 bytes of eeprom */
1229 u8 country[4];
1029 int eeprom_delay; 1230 int eeprom_delay;
1030 1231
1031 struct iw_statistics wstats; 1232 struct iw_statistics wstats;
1032 1233
1234 struct iw_public_data wireless_data;
1235
1033 struct workqueue_struct *workqueue; 1236 struct workqueue_struct *workqueue;
1034 1237
1035 struct work_struct adhoc_check; 1238 struct work_struct adhoc_check;
1036 struct work_struct associate; 1239 struct work_struct associate;
1037 struct work_struct disassociate; 1240 struct work_struct disassociate;
1241 struct work_struct system_config;
1038 struct work_struct rx_replenish; 1242 struct work_struct rx_replenish;
1039 struct work_struct request_scan; 1243 struct work_struct request_scan;
1040 struct work_struct adapter_restart; 1244 struct work_struct adapter_restart;
@@ -1045,25 +1249,51 @@ struct ipw_priv {
1045 struct work_struct abort_scan; 1249 struct work_struct abort_scan;
1046 struct work_struct roam; 1250 struct work_struct roam;
1047 struct work_struct scan_check; 1251 struct work_struct scan_check;
1252 struct work_struct link_up;
1253 struct work_struct link_down;
1048 1254
1049 struct tasklet_struct irq_tasklet; 1255 struct tasklet_struct irq_tasklet;
1050 1256
1257 /* LED related variables and work_struct */
1258 u8 nic_type;
1259 u32 led_activity_on;
1260 u32 led_activity_off;
1261 u32 led_association_on;
1262 u32 led_association_off;
1263 u32 led_ofdm_on;
1264 u32 led_ofdm_off;
1265
1266 struct work_struct led_link_on;
1267 struct work_struct led_link_off;
1268 struct work_struct led_act_off;
1269 struct work_struct merge_networks;
1270
1271 struct ipw_cmd_log *cmdlog;
1272 int cmdlog_len;
1273 int cmdlog_pos;
1274
1051#define IPW_2200BG 1 1275#define IPW_2200BG 1
1052#define IPW_2915ABG 2 1276#define IPW_2915ABG 2
1053 u8 adapter; 1277 u8 adapter;
1054 1278
1055#define IPW_DEFAULT_TX_POWER 0x14 1279 s8 tx_power;
1056 u8 tx_power;
1057 1280
1058#ifdef CONFIG_PM 1281#ifdef CONFIG_PM
1059 u32 pm_state[16]; 1282 u32 pm_state[16];
1060#endif 1283#endif
1061 1284
1285 struct ipw_fw_error *error;
1286
1062 /* network state */ 1287 /* network state */
1063 1288
1064 /* Used to pass the current INTA value from ISR to Tasklet */ 1289 /* Used to pass the current INTA value from ISR to Tasklet */
1065 u32 isr_inta; 1290 u32 isr_inta;
1066 1291
1292 /* QoS */
1293 struct ipw_qos_info qos_data;
1294 struct work_struct qos_activate;
1295 /*********************************/
1296
1067 /* debugging info */ 1297 /* debugging info */
1068 u32 indirect_dword; 1298 u32 indirect_dword;
1069 u32 direct_dword; 1299 u32 direct_dword;
@@ -1125,6 +1355,8 @@ do { if (ipw_debug_level & (level)) \
1125#define IPW_DL_RF_KILL (1<<17) 1355#define IPW_DL_RF_KILL (1<<17)
1126#define IPW_DL_FW_ERRORS (1<<18) 1356#define IPW_DL_FW_ERRORS (1<<18)
1127 1357
1358#define IPW_DL_LED (1<<19)
1359
1128#define IPW_DL_ORD (1<<20) 1360#define IPW_DL_ORD (1<<20)
1129 1361
1130#define IPW_DL_FRAG (1<<21) 1362#define IPW_DL_FRAG (1<<21)
@@ -1137,6 +1369,8 @@ do { if (ipw_debug_level & (level)) \
1137#define IPW_DL_TRACE (1<<28) 1369#define IPW_DL_TRACE (1<<28)
1138 1370
1139#define IPW_DL_STATS (1<<29) 1371#define IPW_DL_STATS (1<<29)
1372#define IPW_DL_MERGE (1<<30)
1373#define IPW_DL_QOS (1<<31)
1140 1374
1141#define IPW_ERROR(f, a...) printk(KERN_ERR DRV_NAME ": " f, ## a) 1375#define IPW_ERROR(f, a...) printk(KERN_ERR DRV_NAME ": " f, ## a)
1142#define IPW_WARNING(f, a...) printk(KERN_WARNING DRV_NAME ": " f, ## a) 1376#define IPW_WARNING(f, a...) printk(KERN_WARNING DRV_NAME ": " f, ## a)
@@ -1150,6 +1384,7 @@ do { if (ipw_debug_level & (level)) \
1150#define IPW_DEBUG_TX(f, a...) IPW_DEBUG(IPW_DL_TX, f, ## a) 1384#define IPW_DEBUG_TX(f, a...) IPW_DEBUG(IPW_DL_TX, f, ## a)
1151#define IPW_DEBUG_ISR(f, a...) IPW_DEBUG(IPW_DL_ISR, f, ## a) 1385#define IPW_DEBUG_ISR(f, a...) IPW_DEBUG(IPW_DL_ISR, f, ## a)
1152#define IPW_DEBUG_MANAGEMENT(f, a...) IPW_DEBUG(IPW_DL_MANAGE, f, ## a) 1386#define IPW_DEBUG_MANAGEMENT(f, a...) IPW_DEBUG(IPW_DL_MANAGE, f, ## a)
1387#define IPW_DEBUG_LED(f, a...) IPW_DEBUG(IPW_DL_LED, f, ## a)
1153#define IPW_DEBUG_WEP(f, a...) IPW_DEBUG(IPW_DL_WEP, f, ## a) 1388#define IPW_DEBUG_WEP(f, a...) IPW_DEBUG(IPW_DL_WEP, f, ## a)
1154#define IPW_DEBUG_HC(f, a...) IPW_DEBUG(IPW_DL_HOST_COMMAND, f, ## a) 1389#define IPW_DEBUG_HC(f, a...) IPW_DEBUG(IPW_DL_HOST_COMMAND, f, ## a)
1155#define IPW_DEBUG_FRAG(f, a...) IPW_DEBUG(IPW_DL_FRAG, f, ## a) 1390#define IPW_DEBUG_FRAG(f, a...) IPW_DEBUG(IPW_DL_FRAG, f, ## a)
@@ -1163,6 +1398,8 @@ do { if (ipw_debug_level & (level)) \
1163#define IPW_DEBUG_STATE(f, a...) IPW_DEBUG(IPW_DL_STATE | IPW_DL_ASSOC | IPW_DL_INFO, f, ## a) 1398#define IPW_DEBUG_STATE(f, a...) IPW_DEBUG(IPW_DL_STATE | IPW_DL_ASSOC | IPW_DL_INFO, f, ## a)
1164#define IPW_DEBUG_ASSOC(f, a...) IPW_DEBUG(IPW_DL_ASSOC | IPW_DL_INFO, f, ## a) 1399#define IPW_DEBUG_ASSOC(f, a...) IPW_DEBUG(IPW_DL_ASSOC | IPW_DL_INFO, f, ## a)
1165#define IPW_DEBUG_STATS(f, a...) IPW_DEBUG(IPW_DL_STATS, f, ## a) 1400#define IPW_DEBUG_STATS(f, a...) IPW_DEBUG(IPW_DL_STATS, f, ## a)
1401#define IPW_DEBUG_MERGE(f, a...) IPW_DEBUG(IPW_DL_MERGE, f, ## a)
1402#define IPW_DEBUG_QOS(f, a...) IPW_DEBUG(IPW_DL_QOS, f, ## a)
1166 1403
1167#include <linux/ctype.h> 1404#include <linux/ctype.h>
1168 1405
@@ -1177,59 +1414,65 @@ do { if (ipw_debug_level & (level)) \
1177#define DINO_RXFIFO_DATA 0x01 1414#define DINO_RXFIFO_DATA 0x01
1178#define DINO_CONTROL_REG 0x00200000 1415#define DINO_CONTROL_REG 0x00200000
1179 1416
1180#define CX2_INTA_RW 0x00000008 1417#define IPW_INTA_RW 0x00000008
1181#define CX2_INTA_MASK_R 0x0000000C 1418#define IPW_INTA_MASK_R 0x0000000C
1182#define CX2_INDIRECT_ADDR 0x00000010 1419#define IPW_INDIRECT_ADDR 0x00000010
1183#define CX2_INDIRECT_DATA 0x00000014 1420#define IPW_INDIRECT_DATA 0x00000014
1184#define CX2_AUTOINC_ADDR 0x00000018 1421#define IPW_AUTOINC_ADDR 0x00000018
1185#define CX2_AUTOINC_DATA 0x0000001C 1422#define IPW_AUTOINC_DATA 0x0000001C
1186#define CX2_RESET_REG 0x00000020 1423#define IPW_RESET_REG 0x00000020
1187#define CX2_GP_CNTRL_RW 0x00000024 1424#define IPW_GP_CNTRL_RW 0x00000024
1188 1425
1189#define CX2_READ_INT_REGISTER 0xFF4 1426#define IPW_READ_INT_REGISTER 0xFF4
1190 1427
1191#define CX2_GP_CNTRL_BIT_INIT_DONE 0x00000004 1428#define IPW_GP_CNTRL_BIT_INIT_DONE 0x00000004
1192 1429
1193#define CX2_REGISTER_DOMAIN1_END 0x00001000 1430#define IPW_REGISTER_DOMAIN1_END 0x00001000
1194#define CX2_SRAM_READ_INT_REGISTER 0x00000ff4 1431#define IPW_SRAM_READ_INT_REGISTER 0x00000ff4
1195 1432
1196#define CX2_SHARED_LOWER_BOUND 0x00000200 1433#define IPW_SHARED_LOWER_BOUND 0x00000200
1197#define CX2_INTERRUPT_AREA_LOWER_BOUND 0x00000f80 1434#define IPW_INTERRUPT_AREA_LOWER_BOUND 0x00000f80
1198 1435
1199#define CX2_NIC_SRAM_LOWER_BOUND 0x00000000 1436#define IPW_NIC_SRAM_LOWER_BOUND 0x00000000
1200#define CX2_NIC_SRAM_UPPER_BOUND 0x00030000 1437#define IPW_NIC_SRAM_UPPER_BOUND 0x00030000
1201 1438
1202#define CX2_BIT_INT_HOST_SRAM_READ_INT_REGISTER (1 << 29) 1439#define IPW_BIT_INT_HOST_SRAM_READ_INT_REGISTER (1 << 29)
1203#define CX2_GP_CNTRL_BIT_CLOCK_READY 0x00000001 1440#define IPW_GP_CNTRL_BIT_CLOCK_READY 0x00000001
1204#define CX2_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY 0x00000002 1441#define IPW_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY 0x00000002
1205 1442
1206/* 1443/*
1207 * RESET Register Bit Indexes 1444 * RESET Register Bit Indexes
1208 */ 1445 */
1209#define CBD_RESET_REG_PRINCETON_RESET 0x00000001 /* Bit 0 (LSB) */ 1446#define CBD_RESET_REG_PRINCETON_RESET (1<<0)
1210#define CX2_RESET_REG_SW_RESET 0x00000080 /* Bit 7 */ 1447#define IPW_START_STANDBY (1<<2)
1211#define CX2_RESET_REG_MASTER_DISABLED 0x00000100 /* Bit 8 */ 1448#define IPW_ACTIVITY_LED (1<<4)
1212#define CX2_RESET_REG_STOP_MASTER 0x00000200 /* Bit 9 */ 1449#define IPW_ASSOCIATED_LED (1<<5)
1213#define CX2_ARC_KESHET_CONFIG 0x08000000 /* Bit 27 */ 1450#define IPW_OFDM_LED (1<<6)
1214#define CX2_START_STANDBY 0x00000004 /* Bit 2 */ 1451#define IPW_RESET_REG_SW_RESET (1<<7)
1215 1452#define IPW_RESET_REG_MASTER_DISABLED (1<<8)
1216#define CX2_CSR_CIS_UPPER_BOUND 0x00000200 1453#define IPW_RESET_REG_STOP_MASTER (1<<9)
1217#define CX2_DOMAIN_0_END 0x1000 1454#define IPW_GATE_ODMA (1<<25)
1455#define IPW_GATE_IDMA (1<<26)
1456#define IPW_ARC_KESHET_CONFIG (1<<27)
1457#define IPW_GATE_ADMA (1<<29)
1458
1459#define IPW_CSR_CIS_UPPER_BOUND 0x00000200
1460#define IPW_DOMAIN_0_END 0x1000
1218#define CLX_MEM_BAR_SIZE 0x1000 1461#define CLX_MEM_BAR_SIZE 0x1000
1219 1462
1220#define CX2_BASEBAND_CONTROL_STATUS 0X00200000 1463#define IPW_BASEBAND_CONTROL_STATUS 0X00200000
1221#define CX2_BASEBAND_TX_FIFO_WRITE 0X00200004 1464#define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004
1222#define CX2_BASEBAND_RX_FIFO_READ 0X00200004 1465#define IPW_BASEBAND_RX_FIFO_READ 0X00200004
1223#define CX2_BASEBAND_CONTROL_STORE 0X00200010 1466#define IPW_BASEBAND_CONTROL_STORE 0X00200010
1224 1467
1225#define CX2_INTERNAL_CMD_EVENT 0X00300004 1468#define IPW_INTERNAL_CMD_EVENT 0X00300004
1226#define CX2_BASEBAND_POWER_DOWN 0x00000001 1469#define IPW_BASEBAND_POWER_DOWN 0x00000001
1227 1470
1228#define CX2_MEM_HALT_AND_RESET 0x003000e0 1471#define IPW_MEM_HALT_AND_RESET 0x003000e0
1229 1472
1230/* defgroup bits_halt_reset MEM_HALT_AND_RESET register bits */ 1473/* defgroup bits_halt_reset MEM_HALT_AND_RESET register bits */
1231#define CX2_BIT_HALT_RESET_ON 0x80000000 1474#define IPW_BIT_HALT_RESET_ON 0x80000000
1232#define CX2_BIT_HALT_RESET_OFF 0x00000000 1475#define IPW_BIT_HALT_RESET_OFF 0x00000000
1233 1476
1234#define CB_LAST_VALID 0x20000000 1477#define CB_LAST_VALID 0x20000000
1235#define CB_INT_ENABLED 0x40000000 1478#define CB_INT_ENABLED 0x40000000
@@ -1248,63 +1491,63 @@ do { if (ipw_debug_level & (level)) \
1248#define DMA_CB_STOP_AND_ABORT 0x00000C00 1491#define DMA_CB_STOP_AND_ABORT 0x00000C00
1249#define DMA_CB_START 0x00000100 1492#define DMA_CB_START 0x00000100
1250 1493
1251#define CX2_SHARED_SRAM_SIZE 0x00030000 1494#define IPW_SHARED_SRAM_SIZE 0x00030000
1252#define CX2_SHARED_SRAM_DMA_CONTROL 0x00027000 1495#define IPW_SHARED_SRAM_DMA_CONTROL 0x00027000
1253#define CB_MAX_LENGTH 0x1FFF 1496#define CB_MAX_LENGTH 0x1FFF
1254 1497
1255#define CX2_HOST_EEPROM_DATA_SRAM_SIZE 0xA18 1498#define IPW_HOST_EEPROM_DATA_SRAM_SIZE 0xA18
1256#define CX2_EEPROM_IMAGE_SIZE 0x100 1499#define IPW_EEPROM_IMAGE_SIZE 0x100
1257 1500
1258/* DMA defs */ 1501/* DMA defs */
1259#define CX2_DMA_I_CURRENT_CB 0x003000D0 1502#define IPW_DMA_I_CURRENT_CB 0x003000D0
1260#define CX2_DMA_O_CURRENT_CB 0x003000D4 1503#define IPW_DMA_O_CURRENT_CB 0x003000D4
1261#define CX2_DMA_I_DMA_CONTROL 0x003000A4 1504#define IPW_DMA_I_DMA_CONTROL 0x003000A4
1262#define CX2_DMA_I_CB_BASE 0x003000A0 1505#define IPW_DMA_I_CB_BASE 0x003000A0
1263 1506
1264#define CX2_TX_CMD_QUEUE_BD_BASE (0x00000200) 1507#define IPW_TX_CMD_QUEUE_BD_BASE 0x00000200
1265#define CX2_TX_CMD_QUEUE_BD_SIZE (0x00000204) 1508#define IPW_TX_CMD_QUEUE_BD_SIZE 0x00000204
1266#define CX2_TX_QUEUE_0_BD_BASE (0x00000208) 1509#define IPW_TX_QUEUE_0_BD_BASE 0x00000208
1267#define CX2_TX_QUEUE_0_BD_SIZE (0x0000020C) 1510#define IPW_TX_QUEUE_0_BD_SIZE (0x0000020C)
1268#define CX2_TX_QUEUE_1_BD_BASE (0x00000210) 1511#define IPW_TX_QUEUE_1_BD_BASE 0x00000210
1269#define CX2_TX_QUEUE_1_BD_SIZE (0x00000214) 1512#define IPW_TX_QUEUE_1_BD_SIZE 0x00000214
1270#define CX2_TX_QUEUE_2_BD_BASE (0x00000218) 1513#define IPW_TX_QUEUE_2_BD_BASE 0x00000218
1271#define CX2_TX_QUEUE_2_BD_SIZE (0x0000021C) 1514#define IPW_TX_QUEUE_2_BD_SIZE (0x0000021C)
1272#define CX2_TX_QUEUE_3_BD_BASE (0x00000220) 1515#define IPW_TX_QUEUE_3_BD_BASE 0x00000220
1273#define CX2_TX_QUEUE_3_BD_SIZE (0x00000224) 1516#define IPW_TX_QUEUE_3_BD_SIZE 0x00000224
1274#define CX2_RX_BD_BASE (0x00000240) 1517#define IPW_RX_BD_BASE 0x00000240
1275#define CX2_RX_BD_SIZE (0x00000244) 1518#define IPW_RX_BD_SIZE 0x00000244
1276#define CX2_RFDS_TABLE_LOWER (0x00000500) 1519#define IPW_RFDS_TABLE_LOWER 0x00000500
1277 1520
1278#define CX2_TX_CMD_QUEUE_READ_INDEX (0x00000280) 1521#define IPW_TX_CMD_QUEUE_READ_INDEX 0x00000280
1279#define CX2_TX_QUEUE_0_READ_INDEX (0x00000284) 1522#define IPW_TX_QUEUE_0_READ_INDEX 0x00000284
1280#define CX2_TX_QUEUE_1_READ_INDEX (0x00000288) 1523#define IPW_TX_QUEUE_1_READ_INDEX 0x00000288
1281#define CX2_TX_QUEUE_2_READ_INDEX (0x0000028C) 1524#define IPW_TX_QUEUE_2_READ_INDEX (0x0000028C)
1282#define CX2_TX_QUEUE_3_READ_INDEX (0x00000290) 1525#define IPW_TX_QUEUE_3_READ_INDEX 0x00000290
1283#define CX2_RX_READ_INDEX (0x000002A0) 1526#define IPW_RX_READ_INDEX (0x000002A0)
1284 1527
1285#define CX2_TX_CMD_QUEUE_WRITE_INDEX (0x00000F80) 1528#define IPW_TX_CMD_QUEUE_WRITE_INDEX (0x00000F80)
1286#define CX2_TX_QUEUE_0_WRITE_INDEX (0x00000F84) 1529#define IPW_TX_QUEUE_0_WRITE_INDEX (0x00000F84)
1287#define CX2_TX_QUEUE_1_WRITE_INDEX (0x00000F88) 1530#define IPW_TX_QUEUE_1_WRITE_INDEX (0x00000F88)
1288#define CX2_TX_QUEUE_2_WRITE_INDEX (0x00000F8C) 1531#define IPW_TX_QUEUE_2_WRITE_INDEX (0x00000F8C)
1289#define CX2_TX_QUEUE_3_WRITE_INDEX (0x00000F90) 1532#define IPW_TX_QUEUE_3_WRITE_INDEX (0x00000F90)
1290#define CX2_RX_WRITE_INDEX (0x00000FA0) 1533#define IPW_RX_WRITE_INDEX (0x00000FA0)
1291 1534
1292/* 1535/*
1293 * EEPROM Related Definitions 1536 * EEPROM Related Definitions
1294 */ 1537 */
1295 1538
1296#define IPW_EEPROM_DATA_SRAM_ADDRESS (CX2_SHARED_LOWER_BOUND + 0x814) 1539#define IPW_EEPROM_DATA_SRAM_ADDRESS (IPW_SHARED_LOWER_BOUND + 0x814)
1297#define IPW_EEPROM_DATA_SRAM_SIZE (CX2_SHARED_LOWER_BOUND + 0x818) 1540#define IPW_EEPROM_DATA_SRAM_SIZE (IPW_SHARED_LOWER_BOUND + 0x818)
1298#define IPW_EEPROM_LOAD_DISABLE (CX2_SHARED_LOWER_BOUND + 0x81C) 1541#define IPW_EEPROM_LOAD_DISABLE (IPW_SHARED_LOWER_BOUND + 0x81C)
1299#define IPW_EEPROM_DATA (CX2_SHARED_LOWER_BOUND + 0x820) 1542#define IPW_EEPROM_DATA (IPW_SHARED_LOWER_BOUND + 0x820)
1300#define IPW_EEPROM_UPPER_ADDRESS (CX2_SHARED_LOWER_BOUND + 0x9E0) 1543#define IPW_EEPROM_UPPER_ADDRESS (IPW_SHARED_LOWER_BOUND + 0x9E0)
1301 1544
1302#define IPW_STATION_TABLE_LOWER (CX2_SHARED_LOWER_BOUND + 0xA0C) 1545#define IPW_STATION_TABLE_LOWER (IPW_SHARED_LOWER_BOUND + 0xA0C)
1303#define IPW_STATION_TABLE_UPPER (CX2_SHARED_LOWER_BOUND + 0xB0C) 1546#define IPW_STATION_TABLE_UPPER (IPW_SHARED_LOWER_BOUND + 0xB0C)
1304#define IPW_REQUEST_ATIM (CX2_SHARED_LOWER_BOUND + 0xB0C) 1547#define IPW_REQUEST_ATIM (IPW_SHARED_LOWER_BOUND + 0xB0C)
1305#define IPW_ATIM_SENT (CX2_SHARED_LOWER_BOUND + 0xB10) 1548#define IPW_ATIM_SENT (IPW_SHARED_LOWER_BOUND + 0xB10)
1306#define IPW_WHO_IS_AWAKE (CX2_SHARED_LOWER_BOUND + 0xB14) 1549#define IPW_WHO_IS_AWAKE (IPW_SHARED_LOWER_BOUND + 0xB14)
1307#define IPW_DURING_ATIM_WINDOW (CX2_SHARED_LOWER_BOUND + 0xB18) 1550#define IPW_DURING_ATIM_WINDOW (IPW_SHARED_LOWER_BOUND + 0xB18)
1308 1551
1309#define MSB 1 1552#define MSB 1
1310#define LSB 0 1553#define LSB 0
@@ -1326,15 +1569,15 @@ do { if (ipw_debug_level & (level)) \
1326#define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */ 1569#define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */
1327 1570
1328/* NIC type as found in the one byte EEPROM_NIC_TYPE offset*/ 1571/* NIC type as found in the one byte EEPROM_NIC_TYPE offset*/
1329#define EEPROM_NIC_TYPE_STANDARD 0 1572#define EEPROM_NIC_TYPE_0 0
1330#define EEPROM_NIC_TYPE_DELL 1 1573#define EEPROM_NIC_TYPE_1 1
1331#define EEPROM_NIC_TYPE_FUJITSU 2 1574#define EEPROM_NIC_TYPE_2 2
1332#define EEPROM_NIC_TYPE_IBM 3 1575#define EEPROM_NIC_TYPE_3 3
1333#define EEPROM_NIC_TYPE_HP 4 1576#define EEPROM_NIC_TYPE_4 4
1334 1577
1335#define FW_MEM_REG_LOWER_BOUND 0x00300000 1578#define FW_MEM_REG_LOWER_BOUND 0x00300000
1336#define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40) 1579#define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40)
1337 1580#define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04)
1338#define EEPROM_BIT_SK (1<<0) 1581#define EEPROM_BIT_SK (1<<0)
1339#define EEPROM_BIT_CS (1<<1) 1582#define EEPROM_BIT_CS (1<<1)
1340#define EEPROM_BIT_DI (1<<2) 1583#define EEPROM_BIT_DI (1<<2)
@@ -1343,50 +1586,47 @@ do { if (ipw_debug_level & (level)) \
1343#define EEPROM_CMD_READ 0x2 1586#define EEPROM_CMD_READ 0x2
1344 1587
1345/* Interrupts masks */ 1588/* Interrupts masks */
1346#define CX2_INTA_NONE 0x00000000 1589#define IPW_INTA_NONE 0x00000000
1347 1590
1348#define CX2_INTA_BIT_RX_TRANSFER 0x00000002 1591#define IPW_INTA_BIT_RX_TRANSFER 0x00000002
1349#define CX2_INTA_BIT_STATUS_CHANGE 0x00000010 1592#define IPW_INTA_BIT_STATUS_CHANGE 0x00000010
1350#define CX2_INTA_BIT_BEACON_PERIOD_EXPIRED 0x00000020 1593#define IPW_INTA_BIT_BEACON_PERIOD_EXPIRED 0x00000020
1351 1594
1352//Inta Bits for CF 1595//Inta Bits for CF
1353#define CX2_INTA_BIT_TX_CMD_QUEUE 0x00000800 1596#define IPW_INTA_BIT_TX_CMD_QUEUE 0x00000800
1354#define CX2_INTA_BIT_TX_QUEUE_1 0x00001000 1597#define IPW_INTA_BIT_TX_QUEUE_1 0x00001000
1355#define CX2_INTA_BIT_TX_QUEUE_2 0x00002000 1598#define IPW_INTA_BIT_TX_QUEUE_2 0x00002000
1356#define CX2_INTA_BIT_TX_QUEUE_3 0x00004000 1599#define IPW_INTA_BIT_TX_QUEUE_3 0x00004000
1357#define CX2_INTA_BIT_TX_QUEUE_4 0x00008000 1600#define IPW_INTA_BIT_TX_QUEUE_4 0x00008000
1358 1601
1359#define CX2_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE 0x00010000 1602#define IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE 0x00010000
1360 1603
1361#define CX2_INTA_BIT_PREPARE_FOR_POWER_DOWN 0x00100000 1604#define IPW_INTA_BIT_PREPARE_FOR_POWER_DOWN 0x00100000
1362#define CX2_INTA_BIT_POWER_DOWN 0x00200000 1605#define IPW_INTA_BIT_POWER_DOWN 0x00200000
1363 1606
1364#define CX2_INTA_BIT_FW_INITIALIZATION_DONE 0x01000000 1607#define IPW_INTA_BIT_FW_INITIALIZATION_DONE 0x01000000
1365#define CX2_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE 0x02000000 1608#define IPW_INTA_BIT_FW_CARD_DISABLE_PHY_OFF_DONE 0x02000000
1366#define CX2_INTA_BIT_RF_KILL_DONE 0x04000000 1609#define IPW_INTA_BIT_RF_KILL_DONE 0x04000000
1367#define CX2_INTA_BIT_FATAL_ERROR 0x40000000 1610#define IPW_INTA_BIT_FATAL_ERROR 0x40000000
1368#define CX2_INTA_BIT_PARITY_ERROR 0x80000000 1611#define IPW_INTA_BIT_PARITY_ERROR 0x80000000
1369 1612
1370/* Interrupts enabled at init time. */ 1613/* Interrupts enabled at init time. */
1371#define CX2_INTA_MASK_ALL \ 1614#define IPW_INTA_MASK_ALL \
1372 (CX2_INTA_BIT_TX_QUEUE_1 | \ 1615 (IPW_INTA_BIT_TX_QUEUE_1 | \
1373 CX2_INTA_BIT_TX_QUEUE_2 | \ 1616 IPW_INTA_BIT_TX_QUEUE_2 | \
1374 CX2_INTA_BIT_TX_QUEUE_3 | \ 1617 IPW_INTA_BIT_TX_QUEUE_3 | \
1375 CX2_INTA_BIT_TX_QUEUE_4 | \ 1618 IPW_INTA_BIT_TX_QUEUE_4 | \
1376 CX2_INTA_BIT_TX_CMD_QUEUE | \ 1619 IPW_INTA_BIT_TX_CMD_QUEUE | \
1377 CX2_INTA_BIT_RX_TRANSFER | \ 1620 IPW_INTA_BIT_RX_TRANSFER | \
1378 CX2_INTA_BIT_FATAL_ERROR | \ 1621 IPW_INTA_BIT_FATAL_ERROR | \
1379 CX2_INTA_BIT_PARITY_ERROR | \ 1622 IPW_INTA_BIT_PARITY_ERROR | \
1380 CX2_INTA_BIT_STATUS_CHANGE | \ 1623 IPW_INTA_BIT_STATUS_CHANGE | \
1381 CX2_INTA_BIT_FW_INITIALIZATION_DONE | \ 1624 IPW_INTA_BIT_FW_INITIALIZATION_DONE | \
1382 CX2_INTA_BIT_BEACON_PERIOD_EXPIRED | \ 1625 IPW_INTA_BIT_BEACON_PERIOD_EXPIRED | \
1383 CX2_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE | \ 1626 IPW_INTA_BIT_SLAVE_MODE_HOST_CMD_DONE | \
1384 CX2_INTA_BIT_PREPARE_FOR_POWER_DOWN | \ 1627 IPW_INTA_BIT_PREPARE_FOR_POWER_DOWN | \
1385 CX2_INTA_BIT_POWER_DOWN | \ 1628 IPW_INTA_BIT_POWER_DOWN | \
1386 CX2_INTA_BIT_RF_KILL_DONE ) 1629 IPW_INTA_BIT_RF_KILL_DONE )
1387
1388#define IPWSTATUS_ERROR_LOG (CX2_SHARED_LOWER_BOUND + 0x410)
1389#define IPW_EVENT_LOG (CX2_SHARED_LOWER_BOUND + 0x414)
1390 1630
1391/* FW event log definitions */ 1631/* FW event log definitions */
1392#define EVENT_ELEM_SIZE (3 * sizeof(u32)) 1632#define EVENT_ELEM_SIZE (3 * sizeof(u32))
@@ -1396,6 +1636,11 @@ do { if (ipw_debug_level & (level)) \
1396#define ERROR_ELEM_SIZE (7 * sizeof(u32)) 1636#define ERROR_ELEM_SIZE (7 * sizeof(u32))
1397#define ERROR_START_OFFSET (1 * sizeof(u32)) 1637#define ERROR_START_OFFSET (1 * sizeof(u32))
1398 1638
1639/* TX power level (dbm) */
1640#define IPW_TX_POWER_MIN -12
1641#define IPW_TX_POWER_MAX 20
1642#define IPW_TX_POWER_DEFAULT IPW_TX_POWER_MAX
1643
1399enum { 1644enum {
1400 IPW_FW_ERROR_OK = 0, 1645 IPW_FW_ERROR_OK = 0,
1401 IPW_FW_ERROR_FAIL, 1646 IPW_FW_ERROR_FAIL,
@@ -1408,8 +1653,8 @@ enum {
1408 IPW_FW_ERROR_ALLOC_FAIL, 1653 IPW_FW_ERROR_ALLOC_FAIL,
1409 IPW_FW_ERROR_DMA_UNDERRUN, 1654 IPW_FW_ERROR_DMA_UNDERRUN,
1410 IPW_FW_ERROR_DMA_STATUS, 1655 IPW_FW_ERROR_DMA_STATUS,
1411 IPW_FW_ERROR_DINOSTATUS_ERROR, 1656 IPW_FW_ERROR_DINO_ERROR,
1412 IPW_FW_ERROR_EEPROMSTATUS_ERROR, 1657 IPW_FW_ERROR_EEPROM_ERROR,
1413 IPW_FW_ERROR_SYSASSERT, 1658 IPW_FW_ERROR_SYSASSERT,
1414 IPW_FW_ERROR_FATAL_ERROR 1659 IPW_FW_ERROR_FATAL_ERROR
1415}; 1660};
@@ -1425,6 +1670,8 @@ enum {
1425#define HC_IBSS_RECONF 4 1670#define HC_IBSS_RECONF 4
1426#define HC_DISASSOC_QUIET 5 1671#define HC_DISASSOC_QUIET 5
1427 1672
1673#define HC_QOS_SUPPORT_ASSOC 0x01
1674
1428#define IPW_RATE_CAPABILITIES 1 1675#define IPW_RATE_CAPABILITIES 1
1429#define IPW_RATE_CONNECT 0 1676#define IPW_RATE_CONNECT 0
1430 1677
@@ -1595,18 +1842,20 @@ enum {
1595 IPW_ORD_TABLE_7_LAST 1842 IPW_ORD_TABLE_7_LAST
1596}; 1843};
1597 1844
1598#define IPW_ORDINALS_TABLE_LOWER (CX2_SHARED_LOWER_BOUND + 0x500) 1845#define IPW_ERROR_LOG (IPW_SHARED_LOWER_BOUND + 0x410)
1599#define IPW_ORDINALS_TABLE_0 (CX2_SHARED_LOWER_BOUND + 0x180) 1846#define IPW_EVENT_LOG (IPW_SHARED_LOWER_BOUND + 0x414)
1600#define IPW_ORDINALS_TABLE_1 (CX2_SHARED_LOWER_BOUND + 0x184) 1847#define IPW_ORDINALS_TABLE_LOWER (IPW_SHARED_LOWER_BOUND + 0x500)
1601#define IPW_ORDINALS_TABLE_2 (CX2_SHARED_LOWER_BOUND + 0x188) 1848#define IPW_ORDINALS_TABLE_0 (IPW_SHARED_LOWER_BOUND + 0x180)
1602#define IPW_MEM_FIXED_OVERRIDE (CX2_SHARED_LOWER_BOUND + 0x41C) 1849#define IPW_ORDINALS_TABLE_1 (IPW_SHARED_LOWER_BOUND + 0x184)
1850#define IPW_ORDINALS_TABLE_2 (IPW_SHARED_LOWER_BOUND + 0x188)
1851#define IPW_MEM_FIXED_OVERRIDE (IPW_SHARED_LOWER_BOUND + 0x41C)
1603 1852
1604struct ipw_fixed_rate { 1853struct ipw_fixed_rate {
1605 u16 tx_rates; 1854 u16 tx_rates;
1606 u16 reserved; 1855 u16 reserved;
1607} __attribute__ ((packed)); 1856} __attribute__ ((packed));
1608 1857
1609#define CX2_INDIRECT_ADDR_MASK (~0x3ul) 1858#define IPW_INDIRECT_ADDR_MASK (~0x3ul)
1610 1859
1611struct host_cmd { 1860struct host_cmd {
1612 u8 cmd; 1861 u8 cmd;
@@ -1615,6 +1864,12 @@ struct host_cmd {
1615 u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH]; 1864 u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH];
1616} __attribute__ ((packed)); 1865} __attribute__ ((packed));
1617 1866
1867struct ipw_cmd_log {
1868 unsigned long jiffies;
1869 int retcode;
1870 struct host_cmd cmd;
1871};
1872
1618#define CFG_BT_COEXISTENCE_MIN 0x00 1873#define CFG_BT_COEXISTENCE_MIN 0x00
1619#define CFG_BT_COEXISTENCE_DEFER 0x02 1874#define CFG_BT_COEXISTENCE_DEFER 0x02
1620#define CFG_BT_COEXISTENCE_KILL 0x04 1875#define CFG_BT_COEXISTENCE_KILL 0x04
@@ -1643,15 +1898,6 @@ struct host_cmd {
1643#define REG_CHANNEL_MASK 0x00003FFF 1898#define REG_CHANNEL_MASK 0x00003FFF
1644#define IPW_IBSS_11B_DEFAULT_MASK 0x87ff 1899#define IPW_IBSS_11B_DEFAULT_MASK 0x87ff
1645 1900
1646static const long ipw_frequencies[] = {
1647 2412, 2417, 2422, 2427,
1648 2432, 2437, 2442, 2447,
1649 2452, 2457, 2462, 2467,
1650 2472, 2484
1651};
1652
1653#define FREQ_COUNT ARRAY_SIZE(ipw_frequencies)
1654
1655#define IPW_MAX_CONFIG_RETRIES 10 1901#define IPW_MAX_CONFIG_RETRIES 10
1656 1902
1657static inline u32 frame_hdr_len(struct ieee80211_hdr_4addr *hdr) 1903static inline u32 frame_hdr_len(struct ieee80211_hdr_4addr *hdr)