This source file includes following definitions.
- read_register
- write_register
- read_register_word
- read_register_byte
- write_register_word
- write_register_byte
- read_nic_dword
- write_nic_dword
- read_nic_word
- write_nic_word
- read_nic_byte
- write_nic_byte
- write_nic_auto_inc_address
- write_nic_dword_auto_inc
- write_nic_memory
- read_nic_memory
- ipw2100_hw_is_adapter_in_system
- ipw2100_get_ordinal
- ipw2100_set_ordinal
- snprint_line
- printk_buf
- schedule_reset
- ipw2100_hw_send_command
- ipw2100_verify
- ipw2100_wait_for_card_state
- sw_reset_and_clock
- ipw2100_download_firmware
- ipw2100_enable_interrupts
- ipw2100_disable_interrupts
- ipw2100_initialize_ordinals
- ipw2100_hw_set_gpio
- rf_kill_active
- ipw2100_get_hw_features
- ipw2100_start_adapter
- ipw2100_reset_fatalerror
- ipw2100_power_cycle_adapter
- ipw2100_hw_phy_off
- ipw2100_enable_adapter
- ipw2100_hw_stop_adapter
- ipw2100_disable_adapter
- ipw2100_set_scan_options
- ipw2100_start_scan
- ipw2100_up
- ipw2100_down
- ipw2100_wdev_init
- ipw2100_reset_adapter
- isr_indicate_associated
- ipw2100_set_essid
- isr_indicate_association_lost
- isr_indicate_rf_kill
- ipw2100_scan_event
- isr_scan_complete
- isr_indicate_scanning
- isr_status_change
- isr_rx_complete_command
- ipw2100_alloc_skb
- ipw2100_snapshot_free
- ipw2100_snapshot_alloc
- ipw2100_match_buf
- ipw2100_corruption_detected
- isr_rx
- isr_rx_monitor
- ipw2100_corruption_check
- __ipw2100_rx_process
- __ipw2100_tx_process
- __ipw2100_tx_complete
- ipw2100_tx_send_commands
- ipw2100_tx_send_data
- ipw2100_irq_tasklet
- ipw2100_interrupt
- ipw2100_tx
- ipw2100_msg_allocate
- ipw2100_msg_initialize
- ipw2100_msg_free
- show_pci
- show_cfg
- show_status
- show_capability
- show_registers
- show_hardware
- show_memory
- store_memory
- show_ordinals
- show_stats
- ipw2100_switch_mode
- show_internals
- show_bssinfo
- debug_level_show
- debug_level_store
- show_fatal_error
- store_fatal_error
- show_scan_age
- store_scan_age
- show_rf_kill
- ipw_radio_kill_sw
- store_rf_kill
- status_queue_allocate
- status_queue_free
- bd_queue_allocate
- bd_queue_free
- bd_queue_initialize
- ipw2100_kill_works
- ipw2100_tx_allocate
- ipw2100_tx_initialize
- ipw2100_tx_free
- ipw2100_rx_allocate
- ipw2100_rx_initialize
- ipw2100_rx_free
- ipw2100_read_mac_address
- ipw2100_set_mac_address
- ipw2100_set_port_type
- ipw2100_set_channel
- ipw2100_system_config
- ipw2100_set_tx_rates
- ipw2100_set_power_mode
- ipw2100_set_rts_threshold
- ipw2100_set_fragmentation_threshold
- ipw2100_set_short_retry
- ipw2100_set_long_retry
- ipw2100_set_mandatory_bssid
- ipw2100_disassociate_bssid
- ipw2100_set_wpa_ie
- ipw2100_set_security_information
- ipw2100_set_tx_power
- ipw2100_set_ibss_beacon_interval
- ipw2100_queues_initialize
- ipw2100_queues_free
- ipw2100_queues_allocate
- ipw2100_set_wep_flags
- ipw2100_set_key
- ipw2100_set_key_index
- ipw2100_configure_security
- ipw2100_security_work
- shim__set_security
- ipw2100_adapter_setup
- ipw2100_set_address
- ipw2100_open
- ipw2100_close
- ipw2100_tx_timeout
- ipw2100_wpa_enable
- ipw2100_wpa_set_auth_algs
- ipw2100_wpa_assoc_frame
- ipw_ethtool_get_drvinfo
- ipw2100_ethtool_get_link
- ipw2100_hang_check
- ipw2100_rf_kill
- ipw2100_alloc_device
- ipw2100_pci_init_one
- ipw2100_pci_remove_one
- ipw2100_suspend
- ipw2100_resume
- ipw2100_shutdown
- ipw2100_init
- ipw2100_exit
- ipw2100_wx_get_name
- ipw2100_wx_set_freq
- ipw2100_wx_get_freq
- ipw2100_wx_set_mode
- ipw2100_wx_get_mode
- ipw2100_wx_get_range
- ipw2100_wx_set_wap
- ipw2100_wx_get_wap
- ipw2100_wx_set_essid
- ipw2100_wx_get_essid
- ipw2100_wx_set_nick
- ipw2100_wx_get_nick
- ipw2100_wx_set_rate
- ipw2100_wx_get_rate
- ipw2100_wx_set_rts
- ipw2100_wx_get_rts
- ipw2100_wx_set_txpow
- ipw2100_wx_get_txpow
- ipw2100_wx_set_frag
- ipw2100_wx_get_frag
- ipw2100_wx_set_retry
- ipw2100_wx_get_retry
- ipw2100_wx_set_scan
- ipw2100_wx_get_scan
- ipw2100_wx_set_encode
- ipw2100_wx_get_encode
- ipw2100_wx_set_power
- ipw2100_wx_get_power
- ipw2100_wx_set_genie
- ipw2100_wx_get_genie
- ipw2100_wx_set_auth
- ipw2100_wx_get_auth
- ipw2100_wx_set_encodeext
- ipw2100_wx_get_encodeext
- ipw2100_wx_set_mlme
- ipw2100_wx_set_promisc
- ipw2100_wx_reset
- ipw2100_wx_set_powermode
- ipw2100_wx_get_powermode
- ipw2100_wx_set_preamble
- ipw2100_wx_get_preamble
- ipw2100_wx_set_crc_check
- ipw2100_wx_get_crc_check
- ipw2100_wx_wireless_stats
- ipw2100_wx_event_work
- ipw2100_mod_firmware_load
- ipw2100_get_firmware
- ipw2100_release_firmware
- ipw2100_get_fwversion
- ipw2100_get_ucodeversion
- ipw2100_fw_download
- ipw2100_ucode_download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 #include <linux/compiler.h>
123 #include <linux/errno.h>
124 #include <linux/if_arp.h>
125 #include <linux/in6.h>
126 #include <linux/in.h>
127 #include <linux/ip.h>
128 #include <linux/kernel.h>
129 #include <linux/kmod.h>
130 #include <linux/module.h>
131 #include <linux/netdevice.h>
132 #include <linux/ethtool.h>
133 #include <linux/pci.h>
134 #include <linux/dma-mapping.h>
135 #include <linux/proc_fs.h>
136 #include <linux/skbuff.h>
137 #include <linux/uaccess.h>
138 #include <asm/io.h>
139 #include <linux/fs.h>
140 #include <linux/mm.h>
141 #include <linux/slab.h>
142 #include <linux/unistd.h>
143 #include <linux/stringify.h>
144 #include <linux/tcp.h>
145 #include <linux/types.h>
146 #include <linux/time.h>
147 #include <linux/firmware.h>
148 #include <linux/acpi.h>
149 #include <linux/ctype.h>
150 #include <linux/pm_qos.h>
151
152 #include <net/lib80211.h>
153
154 #include "ipw2100.h"
155 #include "ipw.h"
156
157 #define IPW2100_VERSION "git-1.2.2"
158
159 #define DRV_NAME "ipw2100"
160 #define DRV_VERSION IPW2100_VERSION
161 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
162 #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
163
164 static struct pm_qos_request ipw2100_pm_qos_req;
165
166
167 #ifdef CONFIG_IPW2100_DEBUG
168 #define IPW2100_RX_DEBUG
169 #endif
170
171 MODULE_DESCRIPTION(DRV_DESCRIPTION);
172 MODULE_VERSION(DRV_VERSION);
173 MODULE_AUTHOR(DRV_COPYRIGHT);
174 MODULE_LICENSE("GPL");
175
176 static int debug = 0;
177 static int network_mode = 0;
178 static int channel = 0;
179 static int associate = 0;
180 static int disable = 0;
181 #ifdef CONFIG_PM
182 static struct ipw2100_fw ipw2100_firmware;
183 #endif
184
185 #include <linux/moduleparam.h>
186 module_param(debug, int, 0444);
187 module_param_named(mode, network_mode, int, 0444);
188 module_param(channel, int, 0444);
189 module_param(associate, int, 0444);
190 module_param(disable, int, 0444);
191
192 MODULE_PARM_DESC(debug, "debug level");
193 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
194 MODULE_PARM_DESC(channel, "channel");
195 MODULE_PARM_DESC(associate, "auto associate when scanning (default off)");
196 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
197
198 static u32 ipw2100_debug_level = IPW_DL_NONE;
199
200 #ifdef CONFIG_IPW2100_DEBUG
201 #define IPW_DEBUG(level, message...) \
202 do { \
203 if (ipw2100_debug_level & (level)) { \
204 printk(KERN_DEBUG "ipw2100: %c %s ", \
205 in_interrupt() ? 'I' : 'U', __func__); \
206 printk(message); \
207 } \
208 } while (0)
209 #else
210 #define IPW_DEBUG(level, message...) do {} while (0)
211 #endif
212
213 #ifdef CONFIG_IPW2100_DEBUG
214 static const char *command_types[] = {
215 "undefined",
216 "unused",
217 "HOST_COMPLETE",
218 "unused",
219 "unused",
220 "unused",
221 "SYSTEM_CONFIG",
222 "unused",
223 "SSID",
224 "MANDATORY_BSSID",
225 "AUTHENTICATION_TYPE",
226 "ADAPTER_ADDRESS",
227 "PORT_TYPE",
228 "INTERNATIONAL_MODE",
229 "CHANNEL",
230 "RTS_THRESHOLD",
231 "FRAG_THRESHOLD",
232 "POWER_MODE",
233 "TX_RATES",
234 "BASIC_TX_RATES",
235 "WEP_KEY_INFO",
236 "unused",
237 "unused",
238 "unused",
239 "unused",
240 "WEP_KEY_INDEX",
241 "WEP_FLAGS",
242 "ADD_MULTICAST",
243 "CLEAR_ALL_MULTICAST",
244 "BEACON_INTERVAL",
245 "ATIM_WINDOW",
246 "CLEAR_STATISTICS",
247 "undefined",
248 "undefined",
249 "undefined",
250 "undefined",
251 "TX_POWER_INDEX",
252 "undefined",
253 "undefined",
254 "undefined",
255 "undefined",
256 "undefined",
257 "undefined",
258 "BROADCAST_SCAN",
259 "CARD_DISABLE",
260 "PREFERRED_BSSID",
261 "SET_SCAN_OPTIONS",
262 "SCAN_DWELL_TIME",
263 "SWEEP_TABLE",
264 "AP_OR_STATION_TABLE",
265 "GROUP_ORDINALS",
266 "SHORT_RETRY_LIMIT",
267 "LONG_RETRY_LIMIT",
268 "unused",
269 "unused",
270 "undefined",
271 "undefined",
272 "undefined",
273 "HOST_PRE_POWER_DOWN",
274 "unused",
275 "undefined",
276 "CARD_DISABLE_PHY_OFF",
277 "MSDU_TX_RATES",
278 "undefined",
279 "SET_STATION_STAT_BITS",
280 "CLEAR_STATIONS_STAT_BITS",
281 "LEAP_ROGUE_MODE",
282 "SET_SECURITY_INFORMATION",
283 "DISASSOCIATION_BSSID",
284 "SET_WPA_ASS_IE"
285 };
286 #endif
287
288 static const long ipw2100_frequencies[] = {
289 2412, 2417, 2422, 2427,
290 2432, 2437, 2442, 2447,
291 2452, 2457, 2462, 2467,
292 2472, 2484
293 };
294
295 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
296
297 static struct ieee80211_rate ipw2100_bg_rates[] = {
298 { .bitrate = 10 },
299 { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
300 { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
301 { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
302 };
303
304 #define RATE_COUNT ARRAY_SIZE(ipw2100_bg_rates)
305
306
307 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
308 static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
309 static int ipw2100_adapter_setup(struct ipw2100_priv *priv);
310
311 static void ipw2100_queues_initialize(struct ipw2100_priv *priv);
312 static void ipw2100_queues_free(struct ipw2100_priv *priv);
313 static int ipw2100_queues_allocate(struct ipw2100_priv *priv);
314
315 static int ipw2100_fw_download(struct ipw2100_priv *priv,
316 struct ipw2100_fw *fw);
317 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
318 struct ipw2100_fw *fw);
319 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
320 size_t max);
321 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
322 size_t max);
323 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
324 struct ipw2100_fw *fw);
325 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
326 struct ipw2100_fw *fw);
327 static void ipw2100_wx_event_work(struct work_struct *work);
328 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev);
329 static const struct iw_handler_def ipw2100_wx_handler_def;
330
331 static inline void read_register(struct net_device *dev, u32 reg, u32 * val)
332 {
333 struct ipw2100_priv *priv = libipw_priv(dev);
334
335 *val = ioread32(priv->ioaddr + reg);
336 IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val);
337 }
338
339 static inline void write_register(struct net_device *dev, u32 reg, u32 val)
340 {
341 struct ipw2100_priv *priv = libipw_priv(dev);
342
343 iowrite32(val, priv->ioaddr + reg);
344 IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val);
345 }
346
347 static inline void read_register_word(struct net_device *dev, u32 reg,
348 u16 * val)
349 {
350 struct ipw2100_priv *priv = libipw_priv(dev);
351
352 *val = ioread16(priv->ioaddr + reg);
353 IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val);
354 }
355
356 static inline void read_register_byte(struct net_device *dev, u32 reg, u8 * val)
357 {
358 struct ipw2100_priv *priv = libipw_priv(dev);
359
360 *val = ioread8(priv->ioaddr + reg);
361 IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val);
362 }
363
364 static inline void write_register_word(struct net_device *dev, u32 reg, u16 val)
365 {
366 struct ipw2100_priv *priv = libipw_priv(dev);
367
368 iowrite16(val, priv->ioaddr + reg);
369 IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val);
370 }
371
372 static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val)
373 {
374 struct ipw2100_priv *priv = libipw_priv(dev);
375
376 iowrite8(val, priv->ioaddr + reg);
377 IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val);
378 }
379
380 static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 * val)
381 {
382 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
383 addr & IPW_REG_INDIRECT_ADDR_MASK);
384 read_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
385 }
386
387 static inline void write_nic_dword(struct net_device *dev, u32 addr, u32 val)
388 {
389 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
390 addr & IPW_REG_INDIRECT_ADDR_MASK);
391 write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
392 }
393
394 static inline void read_nic_word(struct net_device *dev, u32 addr, u16 * val)
395 {
396 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
397 addr & IPW_REG_INDIRECT_ADDR_MASK);
398 read_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
399 }
400
401 static inline void write_nic_word(struct net_device *dev, u32 addr, u16 val)
402 {
403 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
404 addr & IPW_REG_INDIRECT_ADDR_MASK);
405 write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
406 }
407
408 static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 * val)
409 {
410 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
411 addr & IPW_REG_INDIRECT_ADDR_MASK);
412 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
413 }
414
415 static inline void write_nic_byte(struct net_device *dev, u32 addr, u8 val)
416 {
417 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
418 addr & IPW_REG_INDIRECT_ADDR_MASK);
419 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
420 }
421
422 static inline void write_nic_auto_inc_address(struct net_device *dev, u32 addr)
423 {
424 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS,
425 addr & IPW_REG_INDIRECT_ADDR_MASK);
426 }
427
428 static inline void write_nic_dword_auto_inc(struct net_device *dev, u32 val)
429 {
430 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, val);
431 }
432
433 static void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
434 const u8 * buf)
435 {
436 u32 aligned_addr;
437 u32 aligned_len;
438 u32 dif_len;
439 u32 i;
440
441
442 aligned_addr = addr & (~0x3);
443 dif_len = addr - aligned_addr;
444 if (dif_len) {
445
446 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
447 aligned_addr);
448 for (i = dif_len; i < 4; i++, buf++)
449 write_register_byte(dev,
450 IPW_REG_INDIRECT_ACCESS_DATA + i,
451 *buf);
452
453 len -= dif_len;
454 aligned_addr += 4;
455 }
456
457
458 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
459 aligned_len = len & (~0x3);
460 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
461 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *) buf);
462
463
464 dif_len = len - aligned_len;
465 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
466 for (i = 0; i < dif_len; i++, buf++)
467 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i,
468 *buf);
469 }
470
471 static void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
472 u8 * buf)
473 {
474 u32 aligned_addr;
475 u32 aligned_len;
476 u32 dif_len;
477 u32 i;
478
479
480 aligned_addr = addr & (~0x3);
481 dif_len = addr - aligned_addr;
482 if (dif_len) {
483
484 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
485 aligned_addr);
486 for (i = dif_len; i < 4; i++, buf++)
487 read_register_byte(dev,
488 IPW_REG_INDIRECT_ACCESS_DATA + i,
489 buf);
490
491 len -= dif_len;
492 aligned_addr += 4;
493 }
494
495
496 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
497 aligned_len = len & (~0x3);
498 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
499 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, (u32 *) buf);
500
501
502 dif_len = len - aligned_len;
503 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
504 for (i = 0; i < dif_len; i++, buf++)
505 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf);
506 }
507
508 static bool ipw2100_hw_is_adapter_in_system(struct net_device *dev)
509 {
510 u32 dbg;
511
512 read_register(dev, IPW_REG_DOA_DEBUG_AREA_START, &dbg);
513
514 return dbg == IPW_DATA_DOA_DEBUG_VALUE;
515 }
516
517 static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
518 void *val, u32 * len)
519 {
520 struct ipw2100_ordinals *ordinals = &priv->ordinals;
521 u32 addr;
522 u32 field_info;
523 u16 field_len;
524 u16 field_count;
525 u32 total_length;
526
527 if (ordinals->table1_addr == 0) {
528 printk(KERN_WARNING DRV_NAME ": attempt to use fw ordinals "
529 "before they have been loaded.\n");
530 return -EINVAL;
531 }
532
533 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
534 if (*len < IPW_ORD_TAB_1_ENTRY_SIZE) {
535 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
536
537 printk(KERN_WARNING DRV_NAME
538 ": ordinal buffer length too small, need %zd\n",
539 IPW_ORD_TAB_1_ENTRY_SIZE);
540
541 return -EINVAL;
542 }
543
544 read_nic_dword(priv->net_dev,
545 ordinals->table1_addr + (ord << 2), &addr);
546 read_nic_dword(priv->net_dev, addr, val);
547
548 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
549
550 return 0;
551 }
552
553 if (IS_ORDINAL_TABLE_TWO(ordinals, ord)) {
554
555 ord -= IPW_START_ORD_TAB_2;
556
557
558 read_nic_dword(priv->net_dev,
559 ordinals->table2_addr + (ord << 3), &addr);
560
561
562
563 read_nic_dword(priv->net_dev,
564 ordinals->table2_addr + (ord << 3) + sizeof(u32),
565 &field_info);
566
567
568 field_len = *((u16 *) & field_info);
569
570
571 field_count = *(((u16 *) & field_info) + 1);
572
573
574 total_length = field_len * field_count;
575 if (total_length > *len) {
576 *len = total_length;
577 return -EINVAL;
578 }
579
580 *len = total_length;
581 if (!total_length)
582 return 0;
583
584
585 read_nic_memory(priv->net_dev, addr, total_length, val);
586
587 return 0;
588 }
589
590 printk(KERN_WARNING DRV_NAME ": ordinal %d neither in table 1 nor "
591 "in table 2\n", ord);
592
593 return -EINVAL;
594 }
595
596 static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val,
597 u32 * len)
598 {
599 struct ipw2100_ordinals *ordinals = &priv->ordinals;
600 u32 addr;
601
602 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
603 if (*len != IPW_ORD_TAB_1_ENTRY_SIZE) {
604 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
605 IPW_DEBUG_INFO("wrong size\n");
606 return -EINVAL;
607 }
608
609 read_nic_dword(priv->net_dev,
610 ordinals->table1_addr + (ord << 2), &addr);
611
612 write_nic_dword(priv->net_dev, addr, *val);
613
614 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
615
616 return 0;
617 }
618
619 IPW_DEBUG_INFO("wrong table\n");
620 if (IS_ORDINAL_TABLE_TWO(ordinals, ord))
621 return -EINVAL;
622
623 return -EINVAL;
624 }
625
626 static char *snprint_line(char *buf, size_t count,
627 const u8 * data, u32 len, u32 ofs)
628 {
629 int out, i, j, l;
630 char c;
631
632 out = snprintf(buf, count, "%08X", ofs);
633
634 for (l = 0, i = 0; i < 2; i++) {
635 out += snprintf(buf + out, count - out, " ");
636 for (j = 0; j < 8 && l < len; j++, l++)
637 out += snprintf(buf + out, count - out, "%02X ",
638 data[(i * 8 + j)]);
639 for (; j < 8; j++)
640 out += snprintf(buf + out, count - out, " ");
641 }
642
643 out += snprintf(buf + out, count - out, " ");
644 for (l = 0, i = 0; i < 2; i++) {
645 out += snprintf(buf + out, count - out, " ");
646 for (j = 0; j < 8 && l < len; j++, l++) {
647 c = data[(i * 8 + j)];
648 if (!isascii(c) || !isprint(c))
649 c = '.';
650
651 out += snprintf(buf + out, count - out, "%c", c);
652 }
653
654 for (; j < 8; j++)
655 out += snprintf(buf + out, count - out, " ");
656 }
657
658 return buf;
659 }
660
661 static void printk_buf(int level, const u8 * data, u32 len)
662 {
663 char line[81];
664 u32 ofs = 0;
665 if (!(ipw2100_debug_level & level))
666 return;
667
668 while (len) {
669 printk(KERN_DEBUG "%s\n",
670 snprint_line(line, sizeof(line), &data[ofs],
671 min(len, 16U), ofs));
672 ofs += 16;
673 len -= min(len, 16U);
674 }
675 }
676
677 #define MAX_RESET_BACKOFF 10
678
679 static void schedule_reset(struct ipw2100_priv *priv)
680 {
681 time64_t now = ktime_get_boottime_seconds();
682
683
684
685
686 if (priv->reset_backoff &&
687 (now - priv->last_reset > priv->reset_backoff))
688 priv->reset_backoff = 0;
689
690 priv->last_reset = now;
691
692 if (!(priv->status & STATUS_RESET_PENDING)) {
693 IPW_DEBUG_INFO("%s: Scheduling firmware restart (%llds).\n",
694 priv->net_dev->name, priv->reset_backoff);
695 netif_carrier_off(priv->net_dev);
696 netif_stop_queue(priv->net_dev);
697 priv->status |= STATUS_RESET_PENDING;
698 if (priv->reset_backoff)
699 schedule_delayed_work(&priv->reset_work,
700 priv->reset_backoff * HZ);
701 else
702 schedule_delayed_work(&priv->reset_work, 0);
703
704 if (priv->reset_backoff < MAX_RESET_BACKOFF)
705 priv->reset_backoff++;
706
707 wake_up_interruptible(&priv->wait_command_queue);
708 } else
709 IPW_DEBUG_INFO("%s: Firmware restart already in progress.\n",
710 priv->net_dev->name);
711
712 }
713
714 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
715 static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
716 struct host_command *cmd)
717 {
718 struct list_head *element;
719 struct ipw2100_tx_packet *packet;
720 unsigned long flags;
721 int err = 0;
722
723 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n",
724 command_types[cmd->host_command], cmd->host_command,
725 cmd->host_command_length);
726 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters,
727 cmd->host_command_length);
728
729 spin_lock_irqsave(&priv->low_lock, flags);
730
731 if (priv->fatal_error) {
732 IPW_DEBUG_INFO
733 ("Attempt to send command while hardware in fatal error condition.\n");
734 err = -EIO;
735 goto fail_unlock;
736 }
737
738 if (!(priv->status & STATUS_RUNNING)) {
739 IPW_DEBUG_INFO
740 ("Attempt to send command while hardware is not running.\n");
741 err = -EIO;
742 goto fail_unlock;
743 }
744
745 if (priv->status & STATUS_CMD_ACTIVE) {
746 IPW_DEBUG_INFO
747 ("Attempt to send command while another command is pending.\n");
748 err = -EBUSY;
749 goto fail_unlock;
750 }
751
752 if (list_empty(&priv->msg_free_list)) {
753 IPW_DEBUG_INFO("no available msg buffers\n");
754 goto fail_unlock;
755 }
756
757 priv->status |= STATUS_CMD_ACTIVE;
758 priv->messages_sent++;
759
760 element = priv->msg_free_list.next;
761
762 packet = list_entry(element, struct ipw2100_tx_packet, list);
763 packet->jiffy_start = jiffies;
764
765
766 packet->info.c_struct.cmd->host_command_reg = cmd->host_command;
767 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1;
768 packet->info.c_struct.cmd->host_command_len_reg =
769 cmd->host_command_length;
770 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence;
771
772 memcpy(packet->info.c_struct.cmd->host_command_params_reg,
773 cmd->host_command_parameters,
774 sizeof(packet->info.c_struct.cmd->host_command_params_reg));
775
776 list_del(element);
777 DEC_STAT(&priv->msg_free_stat);
778
779 list_add_tail(element, &priv->msg_pend_list);
780 INC_STAT(&priv->msg_pend_stat);
781
782 ipw2100_tx_send_commands(priv);
783 ipw2100_tx_send_data(priv);
784
785 spin_unlock_irqrestore(&priv->low_lock, flags);
786
787
788
789
790
791
792
793 err =
794 wait_event_interruptible_timeout(priv->wait_command_queue,
795 !(priv->
796 status & STATUS_CMD_ACTIVE),
797 HOST_COMPLETE_TIMEOUT);
798
799 if (err == 0) {
800 IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
801 1000 * (HOST_COMPLETE_TIMEOUT / HZ));
802 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT;
803 priv->status &= ~STATUS_CMD_ACTIVE;
804 schedule_reset(priv);
805 return -EIO;
806 }
807
808 if (priv->fatal_error) {
809 printk(KERN_WARNING DRV_NAME ": %s: firmware fatal error\n",
810 priv->net_dev->name);
811 return -EIO;
812 }
813
814
815
816
817
818
819 schedule_timeout_uninterruptible(msecs_to_jiffies(10));
820
821 return 0;
822
823 fail_unlock:
824 spin_unlock_irqrestore(&priv->low_lock, flags);
825
826 return err;
827 }
828
829
830
831
832
833 static int ipw2100_verify(struct ipw2100_priv *priv)
834 {
835 u32 data1, data2;
836 u32 address;
837
838 u32 val1 = 0x76543210;
839 u32 val2 = 0xFEDCBA98;
840
841
842 for (address = IPW_REG_DOA_DEBUG_AREA_START;
843 address < IPW_REG_DOA_DEBUG_AREA_END; address += sizeof(u32)) {
844 read_register(priv->net_dev, address, &data1);
845 if (data1 != IPW_DATA_DOA_DEBUG_VALUE)
846 return -EIO;
847 }
848
849
850 for (address = 0; address < 5; address++) {
851
852 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
853 val1);
854 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
855 val2);
856 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
857 &data1);
858 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
859 &data2);
860 if (val1 == data1 && val2 == data2)
861 return 0;
862 }
863
864 return -EIO;
865 }
866
867
868
869
870
871
872
873
874
875
876 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100
877 static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state)
878 {
879 int i;
880 u32 card_state;
881 u32 len = sizeof(card_state);
882 int err;
883
884 for (i = 0; i <= IPW_CARD_DISABLE_COMPLETE_WAIT * 1000; i += 50) {
885 err = ipw2100_get_ordinal(priv, IPW_ORD_CARD_DISABLED,
886 &card_state, &len);
887 if (err) {
888 IPW_DEBUG_INFO("Query of CARD_DISABLED ordinal "
889 "failed.\n");
890 return 0;
891 }
892
893
894
895
896 if ((card_state == state) ||
897 ((priv->status & STATUS_ENABLED) ?
898 IPW_HW_STATE_ENABLED : IPW_HW_STATE_DISABLED) == state) {
899 if (state == IPW_HW_STATE_ENABLED)
900 priv->status |= STATUS_ENABLED;
901 else
902 priv->status &= ~STATUS_ENABLED;
903
904 return 0;
905 }
906
907 udelay(50);
908 }
909
910 IPW_DEBUG_INFO("ipw2100_wait_for_card_state to %s state timed out\n",
911 state ? "DISABLED" : "ENABLED");
912 return -EIO;
913 }
914
915
916
917
918
919
920 static int sw_reset_and_clock(struct ipw2100_priv *priv)
921 {
922 int i;
923 u32 r;
924
925
926 write_register(priv->net_dev, IPW_REG_RESET_REG,
927 IPW_AUX_HOST_RESET_REG_SW_RESET);
928
929
930 for (i = 0; i < 1000; i++) {
931 udelay(IPW_WAIT_RESET_ARC_COMPLETE_DELAY);
932
933
934 read_register(priv->net_dev, IPW_REG_RESET_REG, &r);
935 if (r & IPW_AUX_HOST_RESET_REG_PRINCETON_RESET)
936 break;
937 }
938
939 if (i == 1000)
940 return -EIO;
941
942
943
944 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
945 IPW_AUX_HOST_GP_CNTRL_BIT_INIT_DONE);
946
947
948 for (i = 0; i < 10000; i++) {
949 udelay(IPW_WAIT_CLOCK_STABILIZATION_DELAY * 4);
950
951
952 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
953 if (r & IPW_AUX_HOST_GP_CNTRL_BIT_CLOCK_READY)
954 break;
955 }
956
957 if (i == 10000)
958 return -EIO;
959
960
961 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
962 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
963 r | IPW_AUX_HOST_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
964
965 return 0;
966 }
967
968
969
970
971
972
973
974
975
976
977
978
979 static int ipw2100_download_firmware(struct ipw2100_priv *priv)
980 {
981 u32 address;
982 int err;
983
984 #ifndef CONFIG_PM
985
986 struct ipw2100_fw ipw2100_firmware;
987 #endif
988
989 if (priv->fatal_error) {
990 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after "
991 "fatal error %d. Interface must be brought down.\n",
992 priv->net_dev->name, priv->fatal_error);
993 return -EINVAL;
994 }
995 #ifdef CONFIG_PM
996 if (!ipw2100_firmware.version) {
997 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
998 if (err) {
999 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
1000 priv->net_dev->name, err);
1001 priv->fatal_error = IPW2100_ERR_FW_LOAD;
1002 goto fail;
1003 }
1004 }
1005 #else
1006 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
1007 if (err) {
1008 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
1009 priv->net_dev->name, err);
1010 priv->fatal_error = IPW2100_ERR_FW_LOAD;
1011 goto fail;
1012 }
1013 #endif
1014 priv->firmware_version = ipw2100_firmware.version;
1015
1016
1017 err = sw_reset_and_clock(priv);
1018 if (err) {
1019 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n",
1020 priv->net_dev->name, err);
1021 goto fail;
1022 }
1023
1024 err = ipw2100_verify(priv);
1025 if (err) {
1026 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n",
1027 priv->net_dev->name, err);
1028 goto fail;
1029 }
1030
1031
1032 write_nic_dword(priv->net_dev,
1033 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1034
1035
1036 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1037
1038
1039 err = ipw2100_ucode_download(priv, &ipw2100_firmware);
1040 if (err) {
1041 printk(KERN_ERR DRV_NAME ": %s: Error loading microcode: %d\n",
1042 priv->net_dev->name, err);
1043 goto fail;
1044 }
1045
1046
1047 write_nic_dword(priv->net_dev,
1048 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1049
1050
1051 err = sw_reset_and_clock(priv);
1052 if (err) {
1053 printk(KERN_ERR DRV_NAME
1054 ": %s: sw_reset_and_clock failed: %d\n",
1055 priv->net_dev->name, err);
1056 goto fail;
1057 }
1058
1059
1060 err = ipw2100_fw_download(priv, &ipw2100_firmware);
1061 if (err) {
1062 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n",
1063 priv->net_dev->name, err);
1064 goto fail;
1065 }
1066 #ifndef CONFIG_PM
1067
1068
1069
1070
1071
1072
1073
1074
1075 ipw2100_release_firmware(priv, &ipw2100_firmware);
1076 #endif
1077
1078
1079 for (address = IPW_HOST_FW_SHARED_AREA0;
1080 address < IPW_HOST_FW_SHARED_AREA0_END; address += 4)
1081 write_nic_dword(priv->net_dev, address, 0);
1082 for (address = IPW_HOST_FW_SHARED_AREA1;
1083 address < IPW_HOST_FW_SHARED_AREA1_END; address += 4)
1084 write_nic_dword(priv->net_dev, address, 0);
1085 for (address = IPW_HOST_FW_SHARED_AREA2;
1086 address < IPW_HOST_FW_SHARED_AREA2_END; address += 4)
1087 write_nic_dword(priv->net_dev, address, 0);
1088 for (address = IPW_HOST_FW_SHARED_AREA3;
1089 address < IPW_HOST_FW_SHARED_AREA3_END; address += 4)
1090 write_nic_dword(priv->net_dev, address, 0);
1091 for (address = IPW_HOST_FW_INTERRUPT_AREA;
1092 address < IPW_HOST_FW_INTERRUPT_AREA_END; address += 4)
1093 write_nic_dword(priv->net_dev, address, 0);
1094
1095 return 0;
1096
1097 fail:
1098 ipw2100_release_firmware(priv, &ipw2100_firmware);
1099 return err;
1100 }
1101
1102 static inline void ipw2100_enable_interrupts(struct ipw2100_priv *priv)
1103 {
1104 if (priv->status & STATUS_INT_ENABLED)
1105 return;
1106 priv->status |= STATUS_INT_ENABLED;
1107 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK);
1108 }
1109
1110 static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv)
1111 {
1112 if (!(priv->status & STATUS_INT_ENABLED))
1113 return;
1114 priv->status &= ~STATUS_INT_ENABLED;
1115 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0);
1116 }
1117
1118 static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv)
1119 {
1120 struct ipw2100_ordinals *ord = &priv->ordinals;
1121
1122 IPW_DEBUG_INFO("enter\n");
1123
1124 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1,
1125 &ord->table1_addr);
1126
1127 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2,
1128 &ord->table2_addr);
1129
1130 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size);
1131 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size);
1132
1133 ord->table2_size &= 0x0000FFFF;
1134
1135 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size);
1136 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size);
1137 IPW_DEBUG_INFO("exit\n");
1138 }
1139
1140 static inline void ipw2100_hw_set_gpio(struct ipw2100_priv *priv)
1141 {
1142 u32 reg = 0;
1143
1144
1145
1146
1147 reg = (IPW_BIT_GPIO_GPIO3_MASK | IPW_BIT_GPIO_GPIO1_ENABLE |
1148 IPW_BIT_GPIO_LED_OFF);
1149 write_register(priv->net_dev, IPW_REG_GPIO, reg);
1150 }
1151
1152 static int rf_kill_active(struct ipw2100_priv *priv)
1153 {
1154 #define MAX_RF_KILL_CHECKS 5
1155 #define RF_KILL_CHECK_DELAY 40
1156
1157 unsigned short value = 0;
1158 u32 reg = 0;
1159 int i;
1160
1161 if (!(priv->hw_features & HW_FEATURE_RFKILL)) {
1162 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false);
1163 priv->status &= ~STATUS_RF_KILL_HW;
1164 return 0;
1165 }
1166
1167 for (i = 0; i < MAX_RF_KILL_CHECKS; i++) {
1168 udelay(RF_KILL_CHECK_DELAY);
1169 read_register(priv->net_dev, IPW_REG_GPIO, ®);
1170 value = (value << 1) | ((reg & IPW_BIT_GPIO_RF_KILL) ? 0 : 1);
1171 }
1172
1173 if (value == 0) {
1174 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
1175 priv->status |= STATUS_RF_KILL_HW;
1176 } else {
1177 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, false);
1178 priv->status &= ~STATUS_RF_KILL_HW;
1179 }
1180
1181 return (value == 0);
1182 }
1183
1184 static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1185 {
1186 u32 addr, len;
1187 u32 val;
1188
1189
1190
1191
1192 len = sizeof(addr);
1193 if (ipw2100_get_ordinal
1194 (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) {
1195 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1196 __LINE__);
1197 return -EIO;
1198 }
1199
1200 IPW_DEBUG_INFO("EEPROM address: %08X\n", addr);
1201
1202
1203
1204
1205 read_nic_dword(priv->net_dev, addr + 0xFC, &val);
1206 priv->eeprom_version = (val >> 24) & 0xFF;
1207 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version);
1208
1209
1210
1211
1212
1213
1214
1215
1216 read_nic_dword(priv->net_dev, addr + 0x20, &val);
1217 if (!((val >> 24) & 0x01))
1218 priv->hw_features |= HW_FEATURE_RFKILL;
1219
1220 IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n",
1221 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not ");
1222
1223 return 0;
1224 }
1225
1226
1227
1228
1229
1230
1231
1232 static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1233 {
1234 int i;
1235 u32 inta, inta_mask, gpio;
1236
1237 IPW_DEBUG_INFO("enter\n");
1238
1239 if (priv->status & STATUS_RUNNING)
1240 return 0;
1241
1242
1243
1244
1245
1246
1247 if (ipw2100_download_firmware(priv)) {
1248 printk(KERN_ERR DRV_NAME
1249 ": %s: Failed to power on the adapter.\n",
1250 priv->net_dev->name);
1251 return -EIO;
1252 }
1253
1254
1255
1256 ipw2100_queues_initialize(priv);
1257
1258 ipw2100_hw_set_gpio(priv);
1259
1260
1261
1262
1263
1264 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1265
1266
1267 IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n");
1268 i = 5000;
1269 do {
1270 schedule_timeout_uninterruptible(msecs_to_jiffies(40));
1271
1272
1273 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1274
1275
1276 if (inta & IPW2100_INTA_FW_INIT_DONE) {
1277
1278 write_register(priv->net_dev, IPW_REG_INTA,
1279 IPW2100_INTA_FW_INIT_DONE);
1280 break;
1281 }
1282
1283
1284
1285
1286 if (inta &
1287 (IPW2100_INTA_FATAL_ERROR | IPW2100_INTA_PARITY_ERROR)) {
1288
1289 write_register(priv->net_dev, IPW_REG_INTA,
1290 IPW2100_INTA_FATAL_ERROR |
1291 IPW2100_INTA_PARITY_ERROR);
1292 }
1293 } while (--i);
1294
1295
1296
1297 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1298 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
1299 inta &= IPW_INTERRUPT_MASK;
1300
1301 if (inta & inta_mask)
1302 write_register(priv->net_dev, IPW_REG_INTA, inta);
1303
1304 IPW_DEBUG_FW("f/w initialization complete: %s\n",
1305 i ? "SUCCESS" : "FAILED");
1306
1307 if (!i) {
1308 printk(KERN_WARNING DRV_NAME
1309 ": %s: Firmware did not initialize.\n",
1310 priv->net_dev->name);
1311 return -EIO;
1312 }
1313
1314
1315 read_register(priv->net_dev, IPW_REG_GPIO, &gpio);
1316
1317 gpio |= (IPW_BIT_GPIO_GPIO1_MASK | IPW_BIT_GPIO_GPIO3_MASK);
1318
1319 write_register(priv->net_dev, IPW_REG_GPIO, gpio);
1320
1321
1322 priv->status |= STATUS_RUNNING;
1323
1324
1325 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
1326
1327 IPW_DEBUG_INFO("exit\n");
1328
1329 return 0;
1330 }
1331
1332 static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv)
1333 {
1334 if (!priv->fatal_error)
1335 return;
1336
1337 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error;
1338 priv->fatal_index %= IPW2100_ERROR_QUEUE;
1339 priv->fatal_error = 0;
1340 }
1341
1342
1343 static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1344 {
1345 u32 reg;
1346 int i;
1347
1348 IPW_DEBUG_INFO("Power cycling the hardware.\n");
1349
1350 ipw2100_hw_set_gpio(priv);
1351
1352
1353 write_register(priv->net_dev, IPW_REG_RESET_REG,
1354 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1355
1356
1357
1358 i = 5;
1359 do {
1360 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
1361 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1362
1363 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1364 break;
1365 } while (--i);
1366
1367 priv->status &= ~STATUS_RESET_PENDING;
1368
1369 if (!i) {
1370 IPW_DEBUG_INFO
1371 ("exit - waited too long for master assert stop\n");
1372 return -EIO;
1373 }
1374
1375 write_register(priv->net_dev, IPW_REG_RESET_REG,
1376 IPW_AUX_HOST_RESET_REG_SW_RESET);
1377
1378
1379 ipw2100_reset_fatalerror(priv);
1380
1381
1382 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING |
1383 STATUS_ASSOCIATED | STATUS_ENABLED);
1384
1385 return 0;
1386 }
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396 static int ipw2100_hw_phy_off(struct ipw2100_priv *priv)
1397 {
1398
1399 #define HW_PHY_OFF_LOOP_DELAY (msecs_to_jiffies(50))
1400
1401 struct host_command cmd = {
1402 .host_command = CARD_DISABLE_PHY_OFF,
1403 .host_command_sequence = 0,
1404 .host_command_length = 0,
1405 };
1406 int err, i;
1407 u32 val1, val2;
1408
1409 IPW_DEBUG_HC("CARD_DISABLE_PHY_OFF\n");
1410
1411
1412 err = ipw2100_hw_send_command(priv, &cmd);
1413 if (err)
1414 return err;
1415
1416 for (i = 0; i < 2500; i++) {
1417 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1);
1418 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2);
1419
1420 if ((val1 & IPW2100_CONTROL_PHY_OFF) &&
1421 (val2 & IPW2100_COMMAND_PHY_OFF))
1422 return 0;
1423
1424 schedule_timeout_uninterruptible(HW_PHY_OFF_LOOP_DELAY);
1425 }
1426
1427 return -EIO;
1428 }
1429
1430 static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1431 {
1432 struct host_command cmd = {
1433 .host_command = HOST_COMPLETE,
1434 .host_command_sequence = 0,
1435 .host_command_length = 0
1436 };
1437 int err = 0;
1438
1439 IPW_DEBUG_HC("HOST_COMPLETE\n");
1440
1441 if (priv->status & STATUS_ENABLED)
1442 return 0;
1443
1444 mutex_lock(&priv->adapter_mutex);
1445
1446 if (rf_kill_active(priv)) {
1447 IPW_DEBUG_HC("Command aborted due to RF kill active.\n");
1448 goto fail_up;
1449 }
1450
1451 err = ipw2100_hw_send_command(priv, &cmd);
1452 if (err) {
1453 IPW_DEBUG_INFO("Failed to send HOST_COMPLETE command\n");
1454 goto fail_up;
1455 }
1456
1457 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED);
1458 if (err) {
1459 IPW_DEBUG_INFO("%s: card not responding to init command.\n",
1460 priv->net_dev->name);
1461 goto fail_up;
1462 }
1463
1464 if (priv->stop_hang_check) {
1465 priv->stop_hang_check = 0;
1466 schedule_delayed_work(&priv->hang_check, HZ / 2);
1467 }
1468
1469 fail_up:
1470 mutex_unlock(&priv->adapter_mutex);
1471 return err;
1472 }
1473
1474 static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1475 {
1476 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
1477
1478 struct host_command cmd = {
1479 .host_command = HOST_PRE_POWER_DOWN,
1480 .host_command_sequence = 0,
1481 .host_command_length = 0,
1482 };
1483 int err, i;
1484 u32 reg;
1485
1486 if (!(priv->status & STATUS_RUNNING))
1487 return 0;
1488
1489 priv->status |= STATUS_STOPPING;
1490
1491
1492
1493
1494 if (!priv->fatal_error) {
1495
1496
1497 ipw2100_enable_adapter(priv);
1498
1499 err = ipw2100_hw_phy_off(priv);
1500 if (err)
1501 printk(KERN_WARNING DRV_NAME
1502 ": Error disabling radio %d\n", err);
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524 IPW_DEBUG_HC("HOST_PRE_POWER_DOWN\n");
1525
1526 err = ipw2100_hw_send_command(priv, &cmd);
1527 if (err)
1528 printk(KERN_WARNING DRV_NAME ": "
1529 "%s: Power down command failed: Error %d\n",
1530 priv->net_dev->name, err);
1531 else
1532 schedule_timeout_uninterruptible(HW_POWER_DOWN_DELAY);
1533 }
1534
1535 priv->status &= ~STATUS_ENABLED;
1536
1537
1538
1539
1540
1541 ipw2100_hw_set_gpio(priv);
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551 write_register(priv->net_dev, IPW_REG_RESET_REG,
1552 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1553
1554
1555
1556 for (i = 5; i > 0; i--) {
1557 udelay(10);
1558
1559
1560 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1561
1562 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1563 break;
1564 }
1565
1566 if (i == 0)
1567 printk(KERN_WARNING DRV_NAME
1568 ": %s: Could now power down adapter.\n",
1569 priv->net_dev->name);
1570
1571
1572 write_register(priv->net_dev, IPW_REG_RESET_REG,
1573 IPW_AUX_HOST_RESET_REG_SW_RESET);
1574
1575 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING);
1576
1577 return 0;
1578 }
1579
1580 static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1581 {
1582 struct host_command cmd = {
1583 .host_command = CARD_DISABLE,
1584 .host_command_sequence = 0,
1585 .host_command_length = 0
1586 };
1587 int err = 0;
1588
1589 IPW_DEBUG_HC("CARD_DISABLE\n");
1590
1591 if (!(priv->status & STATUS_ENABLED))
1592 return 0;
1593
1594
1595 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1596
1597 if (!priv->stop_hang_check) {
1598 priv->stop_hang_check = 1;
1599 cancel_delayed_work(&priv->hang_check);
1600 }
1601
1602 mutex_lock(&priv->adapter_mutex);
1603
1604 err = ipw2100_hw_send_command(priv, &cmd);
1605 if (err) {
1606 printk(KERN_WARNING DRV_NAME
1607 ": exit - failed to send CARD_DISABLE command\n");
1608 goto fail_up;
1609 }
1610
1611 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED);
1612 if (err) {
1613 printk(KERN_WARNING DRV_NAME
1614 ": exit - card failed to change to DISABLED\n");
1615 goto fail_up;
1616 }
1617
1618 IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1619
1620 fail_up:
1621 mutex_unlock(&priv->adapter_mutex);
1622 return err;
1623 }
1624
1625 static int ipw2100_set_scan_options(struct ipw2100_priv *priv)
1626 {
1627 struct host_command cmd = {
1628 .host_command = SET_SCAN_OPTIONS,
1629 .host_command_sequence = 0,
1630 .host_command_length = 8
1631 };
1632 int err;
1633
1634 IPW_DEBUG_INFO("enter\n");
1635
1636 IPW_DEBUG_SCAN("setting scan options\n");
1637
1638 cmd.host_command_parameters[0] = 0;
1639
1640 if (!(priv->config & CFG_ASSOCIATE))
1641 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE;
1642 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled)
1643 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL;
1644 if (priv->config & CFG_PASSIVE_SCAN)
1645 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE;
1646
1647 cmd.host_command_parameters[1] = priv->channel_mask;
1648
1649 err = ipw2100_hw_send_command(priv, &cmd);
1650
1651 IPW_DEBUG_HC("SET_SCAN_OPTIONS 0x%04X\n",
1652 cmd.host_command_parameters[0]);
1653
1654 return err;
1655 }
1656
1657 static int ipw2100_start_scan(struct ipw2100_priv *priv)
1658 {
1659 struct host_command cmd = {
1660 .host_command = BROADCAST_SCAN,
1661 .host_command_sequence = 0,
1662 .host_command_length = 4
1663 };
1664 int err;
1665
1666 IPW_DEBUG_HC("START_SCAN\n");
1667
1668 cmd.host_command_parameters[0] = 0;
1669
1670
1671 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
1672 return 1;
1673
1674 if (priv->status & STATUS_SCANNING) {
1675 IPW_DEBUG_SCAN("Scan requested while already in scan...\n");
1676 return 0;
1677 }
1678
1679 IPW_DEBUG_INFO("enter\n");
1680
1681
1682
1683
1684
1685
1686 IPW_DEBUG_SCAN("starting scan\n");
1687
1688 priv->status |= STATUS_SCANNING;
1689 err = ipw2100_hw_send_command(priv, &cmd);
1690 if (err)
1691 priv->status &= ~STATUS_SCANNING;
1692
1693 IPW_DEBUG_INFO("exit\n");
1694
1695 return err;
1696 }
1697
1698 static const struct libipw_geo ipw_geos[] = {
1699 {
1700 "---",
1701 .bg_channels = 14,
1702 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
1703 {2427, 4}, {2432, 5}, {2437, 6},
1704 {2442, 7}, {2447, 8}, {2452, 9},
1705 {2457, 10}, {2462, 11}, {2467, 12},
1706 {2472, 13}, {2484, 14}},
1707 },
1708 };
1709
1710 static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1711 {
1712 unsigned long flags;
1713 int err = 0;
1714 u32 lock;
1715 u32 ord_len = sizeof(lock);
1716
1717
1718 if (priv->suspend_time) {
1719 libipw_networks_age(priv->ieee, priv->suspend_time);
1720 priv->suspend_time = 0;
1721 }
1722
1723
1724 if (priv->status & STATUS_RF_KILL_SW) {
1725 IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
1726 "switch\n", priv->net_dev->name);
1727 return 0;
1728 }
1729
1730
1731
1732
1733 pm_qos_update_request(&ipw2100_pm_qos_req, 175);
1734
1735
1736 spin_lock_irqsave(&priv->low_lock, flags);
1737 ipw2100_disable_interrupts(priv);
1738
1739
1740 ipw2100_reset_fatalerror(priv);
1741 spin_unlock_irqrestore(&priv->low_lock, flags);
1742
1743 if (priv->status & STATUS_POWERED ||
1744 (priv->status & STATUS_RESET_PENDING)) {
1745
1746 err = ipw2100_power_cycle_adapter(priv);
1747 if (err) {
1748 printk(KERN_WARNING DRV_NAME
1749 ": %s: Could not cycle adapter.\n",
1750 priv->net_dev->name);
1751 goto exit;
1752 }
1753 } else
1754 priv->status |= STATUS_POWERED;
1755
1756
1757 err = ipw2100_start_adapter(priv);
1758 if (err) {
1759 printk(KERN_ERR DRV_NAME
1760 ": %s: Failed to start the firmware.\n",
1761 priv->net_dev->name);
1762 goto exit;
1763 }
1764
1765 ipw2100_initialize_ordinals(priv);
1766
1767
1768 err = ipw2100_get_hw_features(priv);
1769 if (err) {
1770 printk(KERN_ERR DRV_NAME
1771 ": %s: Failed to determine HW features.\n",
1772 priv->net_dev->name);
1773 goto exit;
1774 }
1775
1776
1777 libipw_set_geo(priv->ieee, &ipw_geos[0]);
1778 priv->ieee->freq_band = LIBIPW_24GHZ_BAND;
1779
1780 lock = LOCK_NONE;
1781 err = ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len);
1782 if (err) {
1783 printk(KERN_ERR DRV_NAME
1784 ": %s: Failed to clear ordinal lock.\n",
1785 priv->net_dev->name);
1786 goto exit;
1787 }
1788
1789 priv->status &= ~STATUS_SCANNING;
1790
1791 if (rf_kill_active(priv)) {
1792 printk(KERN_INFO "%s: Radio is disabled by RF switch.\n",
1793 priv->net_dev->name);
1794
1795 if (priv->stop_rf_kill) {
1796 priv->stop_rf_kill = 0;
1797 schedule_delayed_work(&priv->rf_kill,
1798 round_jiffies_relative(HZ));
1799 }
1800
1801 deferred = 1;
1802 }
1803
1804
1805 ipw2100_enable_interrupts(priv);
1806
1807
1808
1809 err = ipw2100_adapter_setup(priv);
1810 if (err) {
1811 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1812 priv->net_dev->name);
1813 goto exit;
1814 }
1815
1816 if (!deferred) {
1817
1818 err = ipw2100_enable_adapter(priv);
1819 if (err) {
1820 printk(KERN_ERR DRV_NAME ": "
1821 "%s: failed in call to enable adapter.\n",
1822 priv->net_dev->name);
1823 ipw2100_hw_stop_adapter(priv);
1824 goto exit;
1825 }
1826
1827
1828 ipw2100_set_scan_options(priv);
1829 ipw2100_start_scan(priv);
1830 }
1831
1832 exit:
1833 return err;
1834 }
1835
1836 static void ipw2100_down(struct ipw2100_priv *priv)
1837 {
1838 unsigned long flags;
1839 union iwreq_data wrqu = {
1840 .ap_addr = {
1841 .sa_family = ARPHRD_ETHER}
1842 };
1843 int associated = priv->status & STATUS_ASSOCIATED;
1844
1845
1846 if (!priv->stop_rf_kill) {
1847 priv->stop_rf_kill = 1;
1848 cancel_delayed_work(&priv->rf_kill);
1849 }
1850
1851
1852 if (!priv->stop_hang_check) {
1853 priv->stop_hang_check = 1;
1854 cancel_delayed_work(&priv->hang_check);
1855 }
1856
1857
1858 if (priv->status & STATUS_RESET_PENDING)
1859 cancel_delayed_work(&priv->reset_work);
1860
1861
1862
1863 spin_lock_irqsave(&priv->low_lock, flags);
1864 ipw2100_enable_interrupts(priv);
1865 spin_unlock_irqrestore(&priv->low_lock, flags);
1866
1867 if (ipw2100_hw_stop_adapter(priv))
1868 printk(KERN_ERR DRV_NAME ": %s: Error stopping adapter.\n",
1869 priv->net_dev->name);
1870
1871
1872
1873
1874 spin_lock_irqsave(&priv->low_lock, flags);
1875 ipw2100_disable_interrupts(priv);
1876 spin_unlock_irqrestore(&priv->low_lock, flags);
1877
1878 pm_qos_update_request(&ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);
1879
1880
1881 if (associated)
1882 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1883
1884 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1885 netif_carrier_off(priv->net_dev);
1886 netif_stop_queue(priv->net_dev);
1887 }
1888
1889 static int ipw2100_wdev_init(struct net_device *dev)
1890 {
1891 struct ipw2100_priv *priv = libipw_priv(dev);
1892 const struct libipw_geo *geo = libipw_get_geo(priv->ieee);
1893 struct wireless_dev *wdev = &priv->ieee->wdev;
1894 int i;
1895
1896 memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);
1897
1898
1899 if (geo->bg_channels) {
1900 struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band;
1901
1902 bg_band->band = NL80211_BAND_2GHZ;
1903 bg_band->n_channels = geo->bg_channels;
1904 bg_band->channels = kcalloc(geo->bg_channels,
1905 sizeof(struct ieee80211_channel),
1906 GFP_KERNEL);
1907 if (!bg_band->channels) {
1908 ipw2100_down(priv);
1909 return -ENOMEM;
1910 }
1911
1912 for (i = 0; i < geo->bg_channels; i++) {
1913 bg_band->channels[i].band = NL80211_BAND_2GHZ;
1914 bg_band->channels[i].center_freq = geo->bg[i].freq;
1915 bg_band->channels[i].hw_value = geo->bg[i].channel;
1916 bg_band->channels[i].max_power = geo->bg[i].max_power;
1917 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY)
1918 bg_band->channels[i].flags |=
1919 IEEE80211_CHAN_NO_IR;
1920 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS)
1921 bg_band->channels[i].flags |=
1922 IEEE80211_CHAN_NO_IR;
1923 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)
1924 bg_band->channels[i].flags |=
1925 IEEE80211_CHAN_RADAR;
1926
1927
1928
1929 }
1930
1931 bg_band->bitrates = ipw2100_bg_rates;
1932 bg_band->n_bitrates = RATE_COUNT;
1933
1934 wdev->wiphy->bands[NL80211_BAND_2GHZ] = bg_band;
1935 }
1936
1937 wdev->wiphy->cipher_suites = ipw_cipher_suites;
1938 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(ipw_cipher_suites);
1939
1940 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);
1941 if (wiphy_register(wdev->wiphy))
1942 return -EIO;
1943 return 0;
1944 }
1945
1946 static void ipw2100_reset_adapter(struct work_struct *work)
1947 {
1948 struct ipw2100_priv *priv =
1949 container_of(work, struct ipw2100_priv, reset_work.work);
1950 unsigned long flags;
1951 union iwreq_data wrqu = {
1952 .ap_addr = {
1953 .sa_family = ARPHRD_ETHER}
1954 };
1955 int associated = priv->status & STATUS_ASSOCIATED;
1956
1957 spin_lock_irqsave(&priv->low_lock, flags);
1958 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1959 priv->resets++;
1960 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1961 priv->status |= STATUS_SECURITY_UPDATED;
1962
1963
1964
1965 cancel_delayed_work(&priv->reset_work);
1966 priv->status |= STATUS_RESET_PENDING;
1967 spin_unlock_irqrestore(&priv->low_lock, flags);
1968
1969 mutex_lock(&priv->action_mutex);
1970
1971 priv->stop_hang_check = 1;
1972 cancel_delayed_work(&priv->hang_check);
1973
1974
1975 if (associated)
1976 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1977
1978 ipw2100_up(priv, 0);
1979 mutex_unlock(&priv->action_mutex);
1980
1981 }
1982
1983 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1984 {
1985
1986 #define MAC_ASSOCIATION_READ_DELAY (HZ)
1987 int ret;
1988 unsigned int len, essid_len;
1989 char essid[IW_ESSID_MAX_SIZE];
1990 u32 txrate;
1991 u32 chan;
1992 char *txratename;
1993 u8 bssid[ETH_ALEN];
1994
1995
1996
1997
1998
1999
2000
2001
2002 essid_len = IW_ESSID_MAX_SIZE;
2003 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID,
2004 essid, &essid_len);
2005 if (ret) {
2006 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2007 __LINE__);
2008 return;
2009 }
2010
2011 len = sizeof(u32);
2012 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
2013 if (ret) {
2014 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2015 __LINE__);
2016 return;
2017 }
2018
2019 len = sizeof(u32);
2020 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
2021 if (ret) {
2022 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2023 __LINE__);
2024 return;
2025 }
2026 len = ETH_ALEN;
2027 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, bssid,
2028 &len);
2029 if (ret) {
2030 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
2031 __LINE__);
2032 return;
2033 }
2034 memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
2035
2036 switch (txrate) {
2037 case TX_RATE_1_MBIT:
2038 txratename = "1Mbps";
2039 break;
2040 case TX_RATE_2_MBIT:
2041 txratename = "2Mbsp";
2042 break;
2043 case TX_RATE_5_5_MBIT:
2044 txratename = "5.5Mbps";
2045 break;
2046 case TX_RATE_11_MBIT:
2047 txratename = "11Mbps";
2048 break;
2049 default:
2050 IPW_DEBUG_INFO("Unknown rate: %d\n", txrate);
2051 txratename = "unknown rate";
2052 break;
2053 }
2054
2055 IPW_DEBUG_INFO("%s: Associated with '%*pE' at %s, channel %d (BSSID=%pM)\n",
2056 priv->net_dev->name, essid_len, essid,
2057 txratename, chan, bssid);
2058
2059
2060 if (!(priv->config & CFG_STATIC_ESSID)) {
2061 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
2062 memcpy(priv->essid, essid, priv->essid_len);
2063 }
2064 priv->channel = chan;
2065 memcpy(priv->bssid, bssid, ETH_ALEN);
2066
2067 priv->status |= STATUS_ASSOCIATING;
2068 priv->connect_start = ktime_get_boottime_seconds();
2069
2070 schedule_delayed_work(&priv->wx_event_work, HZ / 10);
2071 }
2072
2073 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2074 int length, int batch_mode)
2075 {
2076 int ssid_len = min(length, IW_ESSID_MAX_SIZE);
2077 struct host_command cmd = {
2078 .host_command = SSID,
2079 .host_command_sequence = 0,
2080 .host_command_length = ssid_len
2081 };
2082 int err;
2083
2084 IPW_DEBUG_HC("SSID: '%*pE'\n", ssid_len, essid);
2085
2086 if (ssid_len)
2087 memcpy(cmd.host_command_parameters, essid, ssid_len);
2088
2089 if (!batch_mode) {
2090 err = ipw2100_disable_adapter(priv);
2091 if (err)
2092 return err;
2093 }
2094
2095
2096
2097 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2098 int i;
2099 u8 *bogus = (u8 *) cmd.host_command_parameters;
2100 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2101 bogus[i] = 0x18 + i;
2102 cmd.host_command_length = IW_ESSID_MAX_SIZE;
2103 }
2104
2105
2106
2107
2108 err = ipw2100_hw_send_command(priv, &cmd);
2109 if (!err) {
2110 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2111 memcpy(priv->essid, essid, ssid_len);
2112 priv->essid_len = ssid_len;
2113 }
2114
2115 if (!batch_mode) {
2116 if (ipw2100_enable_adapter(priv))
2117 err = -EIO;
2118 }
2119
2120 return err;
2121 }
2122
2123 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2124 {
2125 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | IPW_DL_ASSOC,
2126 "disassociated: '%*pE' %pM\n", priv->essid_len, priv->essid,
2127 priv->bssid);
2128
2129 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
2130
2131 if (priv->status & STATUS_STOPPING) {
2132 IPW_DEBUG_INFO("Card is stopping itself, discard ASSN_LOST.\n");
2133 return;
2134 }
2135
2136 eth_zero_addr(priv->bssid);
2137 eth_zero_addr(priv->ieee->bssid);
2138
2139 netif_carrier_off(priv->net_dev);
2140 netif_stop_queue(priv->net_dev);
2141
2142 if (!(priv->status & STATUS_RUNNING))
2143 return;
2144
2145 if (priv->status & STATUS_SECURITY_UPDATED)
2146 schedule_delayed_work(&priv->security_work, 0);
2147
2148 schedule_delayed_work(&priv->wx_event_work, 0);
2149 }
2150
2151 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2152 {
2153 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2154 priv->net_dev->name);
2155
2156
2157 wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
2158 priv->status |= STATUS_RF_KILL_HW;
2159
2160
2161 priv->stop_rf_kill = 0;
2162 mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ));
2163 }
2164
2165 static void ipw2100_scan_event(struct work_struct *work)
2166 {
2167 struct ipw2100_priv *priv = container_of(work, struct ipw2100_priv,
2168 scan_event.work);
2169 union iwreq_data wrqu;
2170
2171 wrqu.data.length = 0;
2172 wrqu.data.flags = 0;
2173 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
2174 }
2175
2176 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2177 {
2178 IPW_DEBUG_SCAN("scan complete\n");
2179
2180 priv->ieee->scans++;
2181 priv->status &= ~STATUS_SCANNING;
2182
2183
2184 if (!priv->user_requested_scan) {
2185 schedule_delayed_work(&priv->scan_event,
2186 round_jiffies_relative(msecs_to_jiffies(4000)));
2187 } else {
2188 priv->user_requested_scan = 0;
2189 mod_delayed_work(system_wq, &priv->scan_event, 0);
2190 }
2191 }
2192
2193 #ifdef CONFIG_IPW2100_DEBUG
2194 #define IPW2100_HANDLER(v, f) { v, f, # v }
2195 struct ipw2100_status_indicator {
2196 int status;
2197 void (*cb) (struct ipw2100_priv * priv, u32 status);
2198 char *name;
2199 };
2200 #else
2201 #define IPW2100_HANDLER(v, f) { v, f }
2202 struct ipw2100_status_indicator {
2203 int status;
2204 void (*cb) (struct ipw2100_priv * priv, u32 status);
2205 };
2206 #endif
2207
2208 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2209 {
2210 IPW_DEBUG_SCAN("Scanning...\n");
2211 priv->status |= STATUS_SCANNING;
2212 }
2213
2214 static const struct ipw2100_status_indicator status_handlers[] = {
2215 IPW2100_HANDLER(IPW_STATE_INITIALIZED, NULL),
2216 IPW2100_HANDLER(IPW_STATE_COUNTRY_FOUND, NULL),
2217 IPW2100_HANDLER(IPW_STATE_ASSOCIATED, isr_indicate_associated),
2218 IPW2100_HANDLER(IPW_STATE_ASSN_LOST, isr_indicate_association_lost),
2219 IPW2100_HANDLER(IPW_STATE_ASSN_CHANGED, NULL),
2220 IPW2100_HANDLER(IPW_STATE_SCAN_COMPLETE, isr_scan_complete),
2221 IPW2100_HANDLER(IPW_STATE_ENTERED_PSP, NULL),
2222 IPW2100_HANDLER(IPW_STATE_LEFT_PSP, NULL),
2223 IPW2100_HANDLER(IPW_STATE_RF_KILL, isr_indicate_rf_kill),
2224 IPW2100_HANDLER(IPW_STATE_DISABLED, NULL),
2225 IPW2100_HANDLER(IPW_STATE_POWER_DOWN, NULL),
2226 IPW2100_HANDLER(IPW_STATE_SCANNING, isr_indicate_scanning),
2227 IPW2100_HANDLER(-1, NULL)
2228 };
2229
2230 static void isr_status_change(struct ipw2100_priv *priv, int status)
2231 {
2232 int i;
2233
2234 if (status == IPW_STATE_SCANNING &&
2235 priv->status & STATUS_ASSOCIATED &&
2236 !(priv->status & STATUS_SCANNING)) {
2237 IPW_DEBUG_INFO("Scan detected while associated, with "
2238 "no scan request. Restarting firmware.\n");
2239
2240
2241 schedule_reset(priv);
2242 }
2243
2244 for (i = 0; status_handlers[i].status != -1; i++) {
2245 if (status == status_handlers[i].status) {
2246 IPW_DEBUG_NOTIF("Status change: %s\n",
2247 status_handlers[i].name);
2248 if (status_handlers[i].cb)
2249 status_handlers[i].cb(priv, status);
2250 priv->wstats.status = status;
2251 return;
2252 }
2253 }
2254
2255 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2256 }
2257
2258 static void isr_rx_complete_command(struct ipw2100_priv *priv,
2259 struct ipw2100_cmd_header *cmd)
2260 {
2261 #ifdef CONFIG_IPW2100_DEBUG
2262 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
2263 IPW_DEBUG_HC("Command completed '%s (%d)'\n",
2264 command_types[cmd->host_command_reg],
2265 cmd->host_command_reg);
2266 }
2267 #endif
2268 if (cmd->host_command_reg == HOST_COMPLETE)
2269 priv->status |= STATUS_ENABLED;
2270
2271 if (cmd->host_command_reg == CARD_DISABLE)
2272 priv->status &= ~STATUS_ENABLED;
2273
2274 priv->status &= ~STATUS_CMD_ACTIVE;
2275
2276 wake_up_interruptible(&priv->wait_command_queue);
2277 }
2278
2279 #ifdef CONFIG_IPW2100_DEBUG
2280 static const char *frame_types[] = {
2281 "COMMAND_STATUS_VAL",
2282 "STATUS_CHANGE_VAL",
2283 "P80211_DATA_VAL",
2284 "P8023_DATA_VAL",
2285 "HOST_NOTIFICATION_VAL"
2286 };
2287 #endif
2288
2289 static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2290 struct ipw2100_rx_packet *packet)
2291 {
2292 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2293 if (!packet->skb)
2294 return -ENOMEM;
2295
2296 packet->rxp = (struct ipw2100_rx *)packet->skb->data;
2297 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data,
2298 sizeof(struct ipw2100_rx),
2299 PCI_DMA_FROMDEVICE);
2300 if (pci_dma_mapping_error(priv->pci_dev, packet->dma_addr)) {
2301 dev_kfree_skb(packet->skb);
2302 return -ENOMEM;
2303 }
2304
2305 return 0;
2306 }
2307
2308 #define SEARCH_ERROR 0xffffffff
2309 #define SEARCH_FAIL 0xfffffffe
2310 #define SEARCH_SUCCESS 0xfffffff0
2311 #define SEARCH_DISCARD 0
2312 #define SEARCH_SNAPSHOT 1
2313
2314 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2315 static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2316 {
2317 int i;
2318 if (!priv->snapshot[0])
2319 return;
2320 for (i = 0; i < 0x30; i++)
2321 kfree(priv->snapshot[i]);
2322 priv->snapshot[0] = NULL;
2323 }
2324
2325 #ifdef IPW2100_DEBUG_C3
2326 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2327 {
2328 int i;
2329 if (priv->snapshot[0])
2330 return 1;
2331 for (i = 0; i < 0x30; i++) {
2332 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC);
2333 if (!priv->snapshot[i]) {
2334 IPW_DEBUG_INFO("%s: Error allocating snapshot "
2335 "buffer %d\n", priv->net_dev->name, i);
2336 while (i > 0)
2337 kfree(priv->snapshot[--i]);
2338 priv->snapshot[0] = NULL;
2339 return 0;
2340 }
2341 }
2342
2343 return 1;
2344 }
2345
2346 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2347 size_t len, int mode)
2348 {
2349 u32 i, j;
2350 u32 tmp;
2351 u8 *s, *d;
2352 u32 ret;
2353
2354 s = in_buf;
2355 if (mode == SEARCH_SNAPSHOT) {
2356 if (!ipw2100_snapshot_alloc(priv))
2357 mode = SEARCH_DISCARD;
2358 }
2359
2360 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2361 read_nic_dword(priv->net_dev, i, &tmp);
2362 if (mode == SEARCH_SNAPSHOT)
2363 *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2364 if (ret == SEARCH_FAIL) {
2365 d = (u8 *) & tmp;
2366 for (j = 0; j < 4; j++) {
2367 if (*s != *d) {
2368 s = in_buf;
2369 continue;
2370 }
2371
2372 s++;
2373 d++;
2374
2375 if ((s - in_buf) == len)
2376 ret = (i + j) - len + 1;
2377 }
2378 } else if (mode == SEARCH_DISCARD)
2379 return ret;
2380 }
2381
2382 return ret;
2383 }
2384 #endif
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400 #ifdef IPW2100_RX_DEBUG
2401 static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2402 #endif
2403
2404 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2405 {
2406 #ifdef IPW2100_DEBUG_C3
2407 struct ipw2100_status *status = &priv->status_queue.drv[i];
2408 u32 match, reg;
2409 int j;
2410 #endif
2411
2412 IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2413 i * sizeof(struct ipw2100_status));
2414
2415 #ifdef IPW2100_DEBUG_C3
2416
2417 write_register(priv->net_dev, IPW_REG_RESET_REG,
2418 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
2419 j = 5;
2420 do {
2421 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
2422 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
2423
2424 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2425 break;
2426 } while (j--);
2427
2428 match = ipw2100_match_buf(priv, (u8 *) status,
2429 sizeof(struct ipw2100_status),
2430 SEARCH_SNAPSHOT);
2431 if (match < SEARCH_SUCCESS)
2432 IPW_DEBUG_INFO("%s: DMA status match in Firmware at "
2433 "offset 0x%06X, length %d:\n",
2434 priv->net_dev->name, match,
2435 sizeof(struct ipw2100_status));
2436 else
2437 IPW_DEBUG_INFO("%s: No DMA status match in "
2438 "Firmware.\n", priv->net_dev->name);
2439
2440 printk_buf((u8 *) priv->status_queue.drv,
2441 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2442 #endif
2443
2444 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION;
2445 priv->net_dev->stats.rx_errors++;
2446 schedule_reset(priv);
2447 }
2448
2449 static void isr_rx(struct ipw2100_priv *priv, int i,
2450 struct libipw_rx_stats *stats)
2451 {
2452 struct net_device *dev = priv->net_dev;
2453 struct ipw2100_status *status = &priv->status_queue.drv[i];
2454 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2455
2456 IPW_DEBUG_RX("Handler...\n");
2457
2458 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) {
2459 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2460 " Dropping.\n",
2461 dev->name,
2462 status->frame_size, skb_tailroom(packet->skb));
2463 dev->stats.rx_errors++;
2464 return;
2465 }
2466
2467 if (unlikely(!netif_running(dev))) {
2468 dev->stats.rx_errors++;
2469 priv->wstats.discard.misc++;
2470 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2471 return;
2472 }
2473
2474 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2475 !(priv->status & STATUS_ASSOCIATED))) {
2476 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2477 priv->wstats.discard.misc++;
2478 return;
2479 }
2480
2481 pci_unmap_single(priv->pci_dev,
2482 packet->dma_addr,
2483 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2484
2485 skb_put(packet->skb, status->frame_size);
2486
2487 #ifdef IPW2100_RX_DEBUG
2488
2489
2490 skb_copy_from_linear_data(packet->skb, packet_data,
2491 min_t(u32, status->frame_size,
2492 IPW_RX_NIC_BUFFER_LENGTH));
2493 #endif
2494
2495 if (!libipw_rx(priv->ieee, packet->skb, stats)) {
2496 #ifdef IPW2100_RX_DEBUG
2497 IPW_DEBUG_DROP("%s: Non consumed packet:\n",
2498 dev->name);
2499 printk_buf(IPW_DL_DROP, packet_data, status->frame_size);
2500 #endif
2501 dev->stats.rx_errors++;
2502
2503
2504 dev_kfree_skb_any(packet->skb);
2505 packet->skb = NULL;
2506 }
2507
2508
2509 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2510 printk(KERN_WARNING DRV_NAME ": "
2511 "%s: Unable to allocate SKB onto RBD ring - disabling "
2512 "adapter.\n", dev->name);
2513
2514 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2515 }
2516
2517
2518 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2519 }
2520
2521 #ifdef CONFIG_IPW2100_MONITOR
2522
2523 static void isr_rx_monitor(struct ipw2100_priv *priv, int i,
2524 struct libipw_rx_stats *stats)
2525 {
2526 struct net_device *dev = priv->net_dev;
2527 struct ipw2100_status *status = &priv->status_queue.drv[i];
2528 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2529
2530
2531
2532
2533 struct ipw_rt_hdr {
2534 struct ieee80211_radiotap_header rt_hdr;
2535 s8 rt_dbmsignal;
2536 } *ipw_rt;
2537
2538 IPW_DEBUG_RX("Handler...\n");
2539
2540 if (unlikely(status->frame_size > skb_tailroom(packet->skb) -
2541 sizeof(struct ipw_rt_hdr))) {
2542 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2543 " Dropping.\n",
2544 dev->name,
2545 status->frame_size,
2546 skb_tailroom(packet->skb));
2547 dev->stats.rx_errors++;
2548 return;
2549 }
2550
2551 if (unlikely(!netif_running(dev))) {
2552 dev->stats.rx_errors++;
2553 priv->wstats.discard.misc++;
2554 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2555 return;
2556 }
2557
2558 if (unlikely(priv->config & CFG_CRC_CHECK &&
2559 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2560 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2561 dev->stats.rx_errors++;
2562 return;
2563 }
2564
2565 pci_unmap_single(priv->pci_dev, packet->dma_addr,
2566 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2567 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr),
2568 packet->skb->data, status->frame_size);
2569
2570 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data;
2571
2572 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
2573 ipw_rt->rt_hdr.it_pad = 0;
2574 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr));
2575
2576 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
2577
2578 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM;
2579
2580 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr));
2581
2582 if (!libipw_rx(priv->ieee, packet->skb, stats)) {
2583 dev->stats.rx_errors++;
2584
2585
2586 dev_kfree_skb_any(packet->skb);
2587 packet->skb = NULL;
2588 }
2589
2590
2591 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2592 IPW_DEBUG_WARNING(
2593 "%s: Unable to allocate SKB onto RBD ring - disabling "
2594 "adapter.\n", dev->name);
2595
2596 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2597 }
2598
2599
2600 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2601 }
2602
2603 #endif
2604
2605 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2606 {
2607 struct ipw2100_status *status = &priv->status_queue.drv[i];
2608 struct ipw2100_rx *u = priv->rx_buffers[i].rxp;
2609 u16 frame_type = status->status_fields & STATUS_TYPE_MASK;
2610
2611 switch (frame_type) {
2612 case COMMAND_STATUS_VAL:
2613 return (status->frame_size != sizeof(u->rx_data.command));
2614 case STATUS_CHANGE_VAL:
2615 return (status->frame_size != sizeof(u->rx_data.status));
2616 case HOST_NOTIFICATION_VAL:
2617 return (status->frame_size < sizeof(u->rx_data.notification));
2618 case P80211_DATA_VAL:
2619 case P8023_DATA_VAL:
2620 #ifdef CONFIG_IPW2100_MONITOR
2621 return 0;
2622 #else
2623 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2624 case IEEE80211_FTYPE_MGMT:
2625 case IEEE80211_FTYPE_CTL:
2626 return 0;
2627 case IEEE80211_FTYPE_DATA:
2628 return (status->frame_size >
2629 IPW_MAX_802_11_PAYLOAD_LENGTH);
2630 }
2631 #endif
2632 }
2633
2634 return 1;
2635 }
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661 static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2662 {
2663 struct ipw2100_bd_queue *rxq = &priv->rx_queue;
2664 struct ipw2100_status_queue *sq = &priv->status_queue;
2665 struct ipw2100_rx_packet *packet;
2666 u16 frame_type;
2667 u32 r, w, i, s;
2668 struct ipw2100_rx *u;
2669 struct libipw_rx_stats stats = {
2670 .mac_time = jiffies,
2671 };
2672
2673 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r);
2674 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w);
2675
2676 if (r >= rxq->entries) {
2677 IPW_DEBUG_RX("exit - bad read index\n");
2678 return;
2679 }
2680
2681 i = (rxq->next + 1) % rxq->entries;
2682 s = i;
2683 while (i != r) {
2684
2685
2686
2687 packet = &priv->rx_buffers[i];
2688
2689
2690
2691 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
2692 sizeof(struct ipw2100_rx),
2693 PCI_DMA_FROMDEVICE);
2694
2695 if (unlikely(ipw2100_corruption_check(priv, i))) {
2696 ipw2100_corruption_detected(priv, i);
2697 goto increment;
2698 }
2699
2700 u = packet->rxp;
2701 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2702 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2703 stats.len = sq->drv[i].frame_size;
2704
2705 stats.mask = 0;
2706 if (stats.rssi != 0)
2707 stats.mask |= LIBIPW_STATMASK_RSSI;
2708 stats.freq = LIBIPW_24GHZ_BAND;
2709
2710 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2711 priv->net_dev->name, frame_types[frame_type],
2712 stats.len);
2713
2714 switch (frame_type) {
2715 case COMMAND_STATUS_VAL:
2716
2717 isr_rx_complete_command(priv, &u->rx_data.command);
2718 break;
2719
2720 case STATUS_CHANGE_VAL:
2721 isr_status_change(priv, u->rx_data.status);
2722 break;
2723
2724 case P80211_DATA_VAL:
2725 case P8023_DATA_VAL:
2726 #ifdef CONFIG_IPW2100_MONITOR
2727 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2728 isr_rx_monitor(priv, i, &stats);
2729 break;
2730 }
2731 #endif
2732 if (stats.len < sizeof(struct libipw_hdr_3addr))
2733 break;
2734 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2735 case IEEE80211_FTYPE_MGMT:
2736 libipw_rx_mgt(priv->ieee,
2737 &u->rx_data.header, &stats);
2738 break;
2739
2740 case IEEE80211_FTYPE_CTL:
2741 break;
2742
2743 case IEEE80211_FTYPE_DATA:
2744 isr_rx(priv, i, &stats);
2745 break;
2746
2747 }
2748 break;
2749 }
2750
2751 increment:
2752
2753 rxq->drv[i].status.info.field = 0;
2754
2755 i = (i + 1) % rxq->entries;
2756 }
2757
2758 if (i != s) {
2759
2760 rxq->next = (i ? i : rxq->entries) - 1;
2761
2762 write_register(priv->net_dev,
2763 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2764 }
2765 }
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806 static int __ipw2100_tx_process(struct ipw2100_priv *priv)
2807 {
2808 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2809 struct ipw2100_bd *tbd;
2810 struct list_head *element;
2811 struct ipw2100_tx_packet *packet;
2812 int descriptors_used;
2813 int e, i;
2814 u32 r, w, frag_num = 0;
2815
2816 if (list_empty(&priv->fw_pend_list))
2817 return 0;
2818
2819 element = priv->fw_pend_list.next;
2820
2821 packet = list_entry(element, struct ipw2100_tx_packet, list);
2822 tbd = &txq->drv[packet->index];
2823
2824
2825 switch (packet->type) {
2826 case COMMAND:
2827
2828 descriptors_used = 1;
2829 e = txq->oldest;
2830 break;
2831
2832 case DATA:
2833
2834 descriptors_used = tbd->num_fragments;
2835 frag_num = tbd->num_fragments - 1;
2836 e = txq->oldest + frag_num;
2837 e %= txq->entries;
2838 break;
2839
2840 default:
2841 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2842 priv->net_dev->name);
2843 return 0;
2844 }
2845
2846
2847
2848
2849
2850 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
2851 &r);
2852 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2853 &w);
2854 if (w != txq->next)
2855 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2856 priv->net_dev->name);
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880 if (!((r <= w && (e < r || e >= w)) || (e < r && e >= w))) {
2881 IPW_DEBUG_TX("exit - no processed packets ready to release.\n");
2882 return 0;
2883 }
2884
2885 list_del(element);
2886 DEC_STAT(&priv->fw_pend_stat);
2887
2888 #ifdef CONFIG_IPW2100_DEBUG
2889 {
2890 i = txq->oldest;
2891 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2892 &txq->drv[i],
2893 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2894 txq->drv[i].host_addr, txq->drv[i].buf_length);
2895
2896 if (packet->type == DATA) {
2897 i = (i + 1) % txq->entries;
2898
2899 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2900 &txq->drv[i],
2901 (u32) (txq->nic + i *
2902 sizeof(struct ipw2100_bd)),
2903 (u32) txq->drv[i].host_addr,
2904 txq->drv[i].buf_length);
2905 }
2906 }
2907 #endif
2908
2909 switch (packet->type) {
2910 case DATA:
2911 if (txq->drv[txq->oldest].status.info.fields.txType != 0)
2912 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2913 "Expecting DATA TBD but pulled "
2914 "something else: ids %d=%d.\n",
2915 priv->net_dev->name, txq->oldest, packet->index);
2916
2917
2918 for (i = 0; i < frag_num; i++) {
2919 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2920
2921 IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2922 (packet->index + 1 + i) % txq->entries,
2923 tbd->host_addr, tbd->buf_length);
2924
2925 pci_unmap_single(priv->pci_dev,
2926 tbd->host_addr,
2927 tbd->buf_length, PCI_DMA_TODEVICE);
2928 }
2929
2930 libipw_txb_free(packet->info.d_struct.txb);
2931 packet->info.d_struct.txb = NULL;
2932
2933 list_add_tail(element, &priv->tx_free_list);
2934 INC_STAT(&priv->tx_free_stat);
2935
2936
2937
2938 if (priv->status & STATUS_ASSOCIATED)
2939 netif_wake_queue(priv->net_dev);
2940
2941
2942
2943 netif_trans_update(priv->net_dev);
2944
2945 break;
2946
2947 case COMMAND:
2948 if (txq->drv[txq->oldest].status.info.fields.txType != 1)
2949 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2950 "Expecting COMMAND TBD but pulled "
2951 "something else: ids %d=%d.\n",
2952 priv->net_dev->name, txq->oldest, packet->index);
2953
2954 #ifdef CONFIG_IPW2100_DEBUG
2955 if (packet->info.c_struct.cmd->host_command_reg <
2956 ARRAY_SIZE(command_types))
2957 IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2958 command_types[packet->info.c_struct.cmd->
2959 host_command_reg],
2960 packet->info.c_struct.cmd->
2961 host_command_reg,
2962 packet->info.c_struct.cmd->cmd_status_reg);
2963 #endif
2964
2965 list_add_tail(element, &priv->msg_free_list);
2966 INC_STAT(&priv->msg_free_stat);
2967 break;
2968 }
2969
2970
2971 txq->oldest = (e + 1) % txq->entries;
2972
2973 txq->available += descriptors_used;
2974 SET_STAT(&priv->txq_stat, txq->available);
2975
2976 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n",
2977 jiffies - packet->jiffy_start);
2978
2979 return (!list_empty(&priv->fw_pend_list));
2980 }
2981
2982 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
2983 {
2984 int i = 0;
2985
2986 while (__ipw2100_tx_process(priv) && i < 200)
2987 i++;
2988
2989 if (i == 200) {
2990 printk(KERN_WARNING DRV_NAME ": "
2991 "%s: Driver is running slow (%d iters).\n",
2992 priv->net_dev->name, i);
2993 }
2994 }
2995
2996 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2997 {
2998 struct list_head *element;
2999 struct ipw2100_tx_packet *packet;
3000 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3001 struct ipw2100_bd *tbd;
3002 int next = txq->next;
3003
3004 while (!list_empty(&priv->msg_pend_list)) {
3005
3006
3007
3008
3009
3010
3011 if (txq->available <= 3) {
3012 IPW_DEBUG_TX("no room in tx_queue\n");
3013 break;
3014 }
3015
3016 element = priv->msg_pend_list.next;
3017 list_del(element);
3018 DEC_STAT(&priv->msg_pend_stat);
3019
3020 packet = list_entry(element, struct ipw2100_tx_packet, list);
3021
3022 IPW_DEBUG_TX("using TBD at virt=%p, phys=%04X\n",
3023 &txq->drv[txq->next],
3024 (u32) (txq->nic + txq->next *
3025 sizeof(struct ipw2100_bd)));
3026
3027 packet->index = txq->next;
3028
3029 tbd = &txq->drv[txq->next];
3030
3031
3032 tbd->host_addr = packet->info.c_struct.cmd_phys;
3033 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
3034
3035
3036 tbd->num_fragments = 1;
3037 tbd->status.info.field =
3038 IPW_BD_STATUS_TX_FRAME_COMMAND |
3039 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3040
3041
3042 txq->next++;
3043 txq->next %= txq->entries;
3044 txq->available--;
3045 DEC_STAT(&priv->txq_stat);
3046
3047 list_add_tail(element, &priv->fw_pend_list);
3048 INC_STAT(&priv->fw_pend_stat);
3049 }
3050
3051 if (txq->next != next) {
3052
3053
3054 wmb();
3055 write_register(priv->net_dev,
3056 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3057 txq->next);
3058 }
3059 }
3060
3061
3062
3063
3064
3065 static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3066 {
3067 struct list_head *element;
3068 struct ipw2100_tx_packet *packet;
3069 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3070 struct ipw2100_bd *tbd;
3071 int next = txq->next;
3072 int i = 0;
3073 struct ipw2100_data_header *ipw_hdr;
3074 struct libipw_hdr_3addr *hdr;
3075
3076 while (!list_empty(&priv->tx_pend_list)) {
3077
3078
3079
3080
3081
3082
3083 element = priv->tx_pend_list.next;
3084 packet = list_entry(element, struct ipw2100_tx_packet, list);
3085
3086 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
3087 IPW_MAX_BDS)) {
3088
3089
3090 IPW_DEBUG_INFO("%s: Maximum BD threshold exceeded. "
3091 "Increase fragmentation level.\n",
3092 priv->net_dev->name);
3093 }
3094
3095 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
3096 IPW_DEBUG_TX("no room in tx_queue\n");
3097 break;
3098 }
3099
3100 list_del(element);
3101 DEC_STAT(&priv->tx_pend_stat);
3102
3103 tbd = &txq->drv[txq->next];
3104
3105 packet->index = txq->next;
3106
3107 ipw_hdr = packet->info.d_struct.data;
3108 hdr = (struct libipw_hdr_3addr *)packet->info.d_struct.txb->
3109 fragments[0]->data;
3110
3111 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
3112
3113
3114 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3115 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN);
3116 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
3117
3118
3119 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3120 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN);
3121 }
3122
3123 ipw_hdr->host_command_reg = SEND;
3124 ipw_hdr->host_command_reg1 = 0;
3125
3126
3127 ipw_hdr->needs_encryption = 0;
3128 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
3129 if (packet->info.d_struct.txb->nr_frags > 1)
3130 ipw_hdr->fragment_size =
3131 packet->info.d_struct.txb->frag_size -
3132 LIBIPW_3ADDR_LEN;
3133 else
3134 ipw_hdr->fragment_size = 0;
3135
3136 tbd->host_addr = packet->info.d_struct.data_phys;
3137 tbd->buf_length = sizeof(struct ipw2100_data_header);
3138 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
3139 tbd->status.info.field =
3140 IPW_BD_STATUS_TX_FRAME_802_3 |
3141 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3142 txq->next++;
3143 txq->next %= txq->entries;
3144
3145 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
3146 packet->index, tbd->host_addr, tbd->buf_length);
3147 #ifdef CONFIG_IPW2100_DEBUG
3148 if (packet->info.d_struct.txb->nr_frags > 1)
3149 IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
3150 packet->info.d_struct.txb->nr_frags);
3151 #endif
3152
3153 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
3154 tbd = &txq->drv[txq->next];
3155 if (i == packet->info.d_struct.txb->nr_frags - 1)
3156 tbd->status.info.field =
3157 IPW_BD_STATUS_TX_FRAME_802_3 |
3158 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3159 else
3160 tbd->status.info.field =
3161 IPW_BD_STATUS_TX_FRAME_802_3 |
3162 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3163
3164 tbd->buf_length = packet->info.d_struct.txb->
3165 fragments[i]->len - LIBIPW_3ADDR_LEN;
3166
3167 tbd->host_addr = pci_map_single(priv->pci_dev,
3168 packet->info.d_struct.
3169 txb->fragments[i]->
3170 data +
3171 LIBIPW_3ADDR_LEN,
3172 tbd->buf_length,
3173 PCI_DMA_TODEVICE);
3174 if (pci_dma_mapping_error(priv->pci_dev,
3175 tbd->host_addr)) {
3176 IPW_DEBUG_TX("dma mapping error\n");
3177 break;
3178 }
3179
3180 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3181 txq->next, tbd->host_addr,
3182 tbd->buf_length);
3183
3184 pci_dma_sync_single_for_device(priv->pci_dev,
3185 tbd->host_addr,
3186 tbd->buf_length,
3187 PCI_DMA_TODEVICE);
3188
3189 txq->next++;
3190 txq->next %= txq->entries;
3191 }
3192
3193 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3194 SET_STAT(&priv->txq_stat, txq->available);
3195
3196 list_add_tail(element, &priv->fw_pend_list);
3197 INC_STAT(&priv->fw_pend_stat);
3198 }
3199
3200 if (txq->next != next) {
3201
3202
3203 write_register(priv->net_dev,
3204 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3205 txq->next);
3206 }
3207 }
3208
3209 static void ipw2100_irq_tasklet(unsigned long data)
3210 {
3211 struct ipw2100_priv *priv = (struct ipw2100_priv *)data;
3212 struct net_device *dev = priv->net_dev;
3213 unsigned long flags;
3214 u32 inta, tmp;
3215
3216 spin_lock_irqsave(&priv->low_lock, flags);
3217 ipw2100_disable_interrupts(priv);
3218
3219 read_register(dev, IPW_REG_INTA, &inta);
3220
3221 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n",
3222 (unsigned long)inta & IPW_INTERRUPT_MASK);
3223
3224 priv->in_isr++;
3225 priv->interrupts++;
3226
3227
3228
3229
3230 IPW_DEBUG_ISR("INTA: 0x%08lX\n",
3231 (unsigned long)inta & IPW_INTERRUPT_MASK);
3232
3233 if (inta & IPW2100_INTA_FATAL_ERROR) {
3234 printk(KERN_WARNING DRV_NAME
3235 ": Fatal interrupt. Scheduling firmware restart.\n");
3236 priv->inta_other++;
3237 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3238
3239 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3240 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
3241 priv->net_dev->name, priv->fatal_error);
3242
3243 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp);
3244 IPW_DEBUG_INFO("%s: Fatal error address value: 0x%08X\n",
3245 priv->net_dev->name, tmp);
3246
3247
3248 schedule_reset(priv);
3249 }
3250
3251 if (inta & IPW2100_INTA_PARITY_ERROR) {
3252 printk(KERN_ERR DRV_NAME
3253 ": ***** PARITY ERROR INTERRUPT !!!!\n");
3254 priv->inta_other++;
3255 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3256 }
3257
3258 if (inta & IPW2100_INTA_RX_TRANSFER) {
3259 IPW_DEBUG_ISR("RX interrupt\n");
3260
3261 priv->rx_interrupts++;
3262
3263 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3264
3265 __ipw2100_rx_process(priv);
3266 __ipw2100_tx_complete(priv);
3267 }
3268
3269 if (inta & IPW2100_INTA_TX_TRANSFER) {
3270 IPW_DEBUG_ISR("TX interrupt\n");
3271
3272 priv->tx_interrupts++;
3273
3274 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3275
3276 __ipw2100_tx_complete(priv);
3277 ipw2100_tx_send_commands(priv);
3278 ipw2100_tx_send_data(priv);
3279 }
3280
3281 if (inta & IPW2100_INTA_TX_COMPLETE) {
3282 IPW_DEBUG_ISR("TX complete\n");
3283 priv->inta_other++;
3284 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3285
3286 __ipw2100_tx_complete(priv);
3287 }
3288
3289 if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3290
3291 priv->inta_other++;
3292 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3293 }
3294
3295 if (inta & IPW2100_INTA_FW_INIT_DONE) {
3296 IPW_DEBUG_ISR("FW init done interrupt\n");
3297 priv->inta_other++;
3298
3299 read_register(dev, IPW_REG_INTA, &tmp);
3300 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3301 IPW2100_INTA_PARITY_ERROR)) {
3302 write_register(dev, IPW_REG_INTA,
3303 IPW2100_INTA_FATAL_ERROR |
3304 IPW2100_INTA_PARITY_ERROR);
3305 }
3306
3307 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3308 }
3309
3310 if (inta & IPW2100_INTA_STATUS_CHANGE) {
3311 IPW_DEBUG_ISR("Status change interrupt\n");
3312 priv->inta_other++;
3313 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3314 }
3315
3316 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3317 IPW_DEBUG_ISR("slave host mode interrupt\n");
3318 priv->inta_other++;
3319 write_register(dev, IPW_REG_INTA,
3320 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3321 }
3322
3323 priv->in_isr--;
3324 ipw2100_enable_interrupts(priv);
3325
3326 spin_unlock_irqrestore(&priv->low_lock, flags);
3327
3328 IPW_DEBUG_ISR("exit\n");
3329 }
3330
3331 static irqreturn_t ipw2100_interrupt(int irq, void *data)
3332 {
3333 struct ipw2100_priv *priv = data;
3334 u32 inta, inta_mask;
3335
3336 if (!data)
3337 return IRQ_NONE;
3338
3339 spin_lock(&priv->low_lock);
3340
3341
3342
3343
3344
3345 if (!(priv->status & STATUS_INT_ENABLED)) {
3346
3347 goto none;
3348 }
3349
3350 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
3351 read_register(priv->net_dev, IPW_REG_INTA, &inta);
3352
3353 if (inta == 0xFFFFFFFF) {
3354
3355 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n");
3356 goto none;
3357 }
3358
3359 inta &= IPW_INTERRUPT_MASK;
3360
3361 if (!(inta & inta_mask)) {
3362
3363 goto none;
3364 }
3365
3366
3367
3368
3369
3370 ipw2100_disable_interrupts(priv);
3371
3372 tasklet_schedule(&priv->irq_tasklet);
3373 spin_unlock(&priv->low_lock);
3374
3375 return IRQ_HANDLED;
3376 none:
3377 spin_unlock(&priv->low_lock);
3378 return IRQ_NONE;
3379 }
3380
3381 static netdev_tx_t ipw2100_tx(struct libipw_txb *txb,
3382 struct net_device *dev, int pri)
3383 {
3384 struct ipw2100_priv *priv = libipw_priv(dev);
3385 struct list_head *element;
3386 struct ipw2100_tx_packet *packet;
3387 unsigned long flags;
3388
3389 spin_lock_irqsave(&priv->low_lock, flags);
3390
3391 if (!(priv->status & STATUS_ASSOCIATED)) {
3392 IPW_DEBUG_INFO("Can not transmit when not connected.\n");
3393 priv->net_dev->stats.tx_carrier_errors++;
3394 netif_stop_queue(dev);
3395 goto fail_unlock;
3396 }
3397
3398 if (list_empty(&priv->tx_free_list))
3399 goto fail_unlock;
3400
3401 element = priv->tx_free_list.next;
3402 packet = list_entry(element, struct ipw2100_tx_packet, list);
3403
3404 packet->info.d_struct.txb = txb;
3405
3406 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3407 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3408
3409 packet->jiffy_start = jiffies;
3410
3411 list_del(element);
3412 DEC_STAT(&priv->tx_free_stat);
3413
3414 list_add_tail(element, &priv->tx_pend_list);
3415 INC_STAT(&priv->tx_pend_stat);
3416
3417 ipw2100_tx_send_data(priv);
3418
3419 spin_unlock_irqrestore(&priv->low_lock, flags);
3420 return NETDEV_TX_OK;
3421
3422 fail_unlock:
3423 netif_stop_queue(dev);
3424 spin_unlock_irqrestore(&priv->low_lock, flags);
3425 return NETDEV_TX_BUSY;
3426 }
3427
3428 static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3429 {
3430 int i, j, err = -EINVAL;
3431 void *v;
3432 dma_addr_t p;
3433
3434 priv->msg_buffers =
3435 kmalloc_array(IPW_COMMAND_POOL_SIZE,
3436 sizeof(struct ipw2100_tx_packet),
3437 GFP_KERNEL);
3438 if (!priv->msg_buffers)
3439 return -ENOMEM;
3440
3441 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3442 v = pci_zalloc_consistent(priv->pci_dev,
3443 sizeof(struct ipw2100_cmd_header),
3444 &p);
3445 if (!v) {
3446 printk(KERN_ERR DRV_NAME ": "
3447 "%s: PCI alloc failed for msg "
3448 "buffers.\n", priv->net_dev->name);
3449 err = -ENOMEM;
3450 break;
3451 }
3452
3453 priv->msg_buffers[i].type = COMMAND;
3454 priv->msg_buffers[i].info.c_struct.cmd =
3455 (struct ipw2100_cmd_header *)v;
3456 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3457 }
3458
3459 if (i == IPW_COMMAND_POOL_SIZE)
3460 return 0;
3461
3462 for (j = 0; j < i; j++) {
3463 pci_free_consistent(priv->pci_dev,
3464 sizeof(struct ipw2100_cmd_header),
3465 priv->msg_buffers[j].info.c_struct.cmd,
3466 priv->msg_buffers[j].info.c_struct.
3467 cmd_phys);
3468 }
3469
3470 kfree(priv->msg_buffers);
3471 priv->msg_buffers = NULL;
3472
3473 return err;
3474 }
3475
3476 static int ipw2100_msg_initialize(struct ipw2100_priv *priv)
3477 {
3478 int i;
3479
3480 INIT_LIST_HEAD(&priv->msg_free_list);
3481 INIT_LIST_HEAD(&priv->msg_pend_list);
3482
3483 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++)
3484 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list);
3485 SET_STAT(&priv->msg_free_stat, i);
3486
3487 return 0;
3488 }
3489
3490 static void ipw2100_msg_free(struct ipw2100_priv *priv)
3491 {
3492 int i;
3493
3494 if (!priv->msg_buffers)
3495 return;
3496
3497 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3498 pci_free_consistent(priv->pci_dev,
3499 sizeof(struct ipw2100_cmd_header),
3500 priv->msg_buffers[i].info.c_struct.cmd,
3501 priv->msg_buffers[i].info.c_struct.
3502 cmd_phys);
3503 }
3504
3505 kfree(priv->msg_buffers);
3506 priv->msg_buffers = NULL;
3507 }
3508
3509 static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3510 char *buf)
3511 {
3512 struct pci_dev *pci_dev = to_pci_dev(d);
3513 char *out = buf;
3514 int i, j;
3515 u32 val;
3516
3517 for (i = 0; i < 16; i++) {
3518 out += sprintf(out, "[%08X] ", i * 16);
3519 for (j = 0; j < 16; j += 4) {
3520 pci_read_config_dword(pci_dev, i * 16 + j, &val);
3521 out += sprintf(out, "%08X ", val);
3522 }
3523 out += sprintf(out, "\n");
3524 }
3525
3526 return out - buf;
3527 }
3528
3529 static DEVICE_ATTR(pci, 0444, show_pci, NULL);
3530
3531 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3532 char *buf)
3533 {
3534 struct ipw2100_priv *p = dev_get_drvdata(d);
3535 return sprintf(buf, "0x%08x\n", (int)p->config);
3536 }
3537
3538 static DEVICE_ATTR(cfg, 0444, show_cfg, NULL);
3539
3540 static ssize_t show_status(struct device *d, struct device_attribute *attr,
3541 char *buf)
3542 {
3543 struct ipw2100_priv *p = dev_get_drvdata(d);
3544 return sprintf(buf, "0x%08x\n", (int)p->status);
3545 }
3546
3547 static DEVICE_ATTR(status, 0444, show_status, NULL);
3548
3549 static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3550 char *buf)
3551 {
3552 struct ipw2100_priv *p = dev_get_drvdata(d);
3553 return sprintf(buf, "0x%08x\n", (int)p->capability);
3554 }
3555
3556 static DEVICE_ATTR(capability, 0444, show_capability, NULL);
3557
3558 #define IPW2100_REG(x) { IPW_ ##x, #x }
3559 static const struct {
3560 u32 addr;
3561 const char *name;
3562 } hw_data[] = {
3563 IPW2100_REG(REG_GP_CNTRL),
3564 IPW2100_REG(REG_GPIO),
3565 IPW2100_REG(REG_INTA),
3566 IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3567 #define IPW2100_NIC(x, s) { x, #x, s }
3568 static const struct {
3569 u32 addr;
3570 const char *name;
3571 size_t size;
3572 } nic_data[] = {
3573 IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3574 IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3575 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3576 static const struct {
3577 u8 index;
3578 const char *name;
3579 const char *desc;
3580 } ord_data[] = {
3581 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3582 IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3583 "successful Host Tx's (MSDU)"),
3584 IPW2100_ORD(STAT_TX_DIR_DATA,
3585 "successful Directed Tx's (MSDU)"),
3586 IPW2100_ORD(STAT_TX_DIR_DATA1,
3587 "successful Directed Tx's (MSDU) @ 1MB"),
3588 IPW2100_ORD(STAT_TX_DIR_DATA2,
3589 "successful Directed Tx's (MSDU) @ 2MB"),
3590 IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3591 "successful Directed Tx's (MSDU) @ 5_5MB"),
3592 IPW2100_ORD(STAT_TX_DIR_DATA11,
3593 "successful Directed Tx's (MSDU) @ 11MB"),
3594 IPW2100_ORD(STAT_TX_NODIR_DATA1,
3595 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3596 IPW2100_ORD(STAT_TX_NODIR_DATA2,
3597 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3598 IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3599 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3600 IPW2100_ORD(STAT_TX_NODIR_DATA11,
3601 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3602 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3603 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3604 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3605 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3606 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3607 IPW2100_ORD(STAT_TX_ASSN_RESP,
3608 "successful Association response Tx's"),
3609 IPW2100_ORD(STAT_TX_REASSN,
3610 "successful Reassociation Tx's"),
3611 IPW2100_ORD(STAT_TX_REASSN_RESP,
3612 "successful Reassociation response Tx's"),
3613 IPW2100_ORD(STAT_TX_PROBE,
3614 "probes successfully transmitted"),
3615 IPW2100_ORD(STAT_TX_PROBE_RESP,
3616 "probe responses successfully transmitted"),
3617 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3618 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3619 IPW2100_ORD(STAT_TX_DISASSN,
3620 "successful Disassociation TX"),
3621 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3622 IPW2100_ORD(STAT_TX_DEAUTH,
3623 "successful Deauthentication TX"),
3624 IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3625 "Total successful Tx data bytes"),
3626 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3627 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3628 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3629 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3630 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3631 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3632 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3633 "times max tries in a hop failed"),
3634 IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3635 "times disassociation failed"),
3636 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3637 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3638 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3639 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3640 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3641 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3642 IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3643 "directed packets at 5.5MB"),
3644 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3645 IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3646 IPW2100_ORD(STAT_RX_NODIR_DATA1,
3647 "nondirected packets at 1MB"),
3648 IPW2100_ORD(STAT_RX_NODIR_DATA2,
3649 "nondirected packets at 2MB"),
3650 IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3651 "nondirected packets at 5.5MB"),
3652 IPW2100_ORD(STAT_RX_NODIR_DATA11,
3653 "nondirected packets at 11MB"),
3654 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3655 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3656 "Rx CTS"),
3657 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3658 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3659 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3660 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3661 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3662 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3663 IPW2100_ORD(STAT_RX_REASSN_RESP,
3664 "Reassociation response Rx's"),
3665 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3666 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3667 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3668 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3669 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3670 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3671 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3672 IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3673 "Total rx data bytes received"),
3674 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3675 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3676 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3677 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3678 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3679 IPW2100_ORD(STAT_RX_DUPLICATE1,
3680 "duplicate rx packets at 1MB"),
3681 IPW2100_ORD(STAT_RX_DUPLICATE2,
3682 "duplicate rx packets at 2MB"),
3683 IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3684 "duplicate rx packets at 5.5MB"),
3685 IPW2100_ORD(STAT_RX_DUPLICATE11,
3686 "duplicate rx packets at 11MB"),
3687 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3688 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"),
3689 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"),
3690 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"),
3691 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3692 "rx frames with invalid protocol"),
3693 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3694 IPW2100_ORD(STAT_RX_NO_BUFFER,
3695 "rx frames rejected due to no buffer"),
3696 IPW2100_ORD(STAT_RX_MISSING_FRAG,
3697 "rx frames dropped due to missing fragment"),
3698 IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3699 "rx frames dropped due to non-sequential fragment"),
3700 IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3701 "rx frames dropped due to unmatched 1st frame"),
3702 IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3703 "rx frames dropped due to uncompleted frame"),
3704 IPW2100_ORD(STAT_RX_ICV_ERRORS,
3705 "ICV errors during decryption"),
3706 IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3707 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3708 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3709 "poll response timeouts"),
3710 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3711 "timeouts waiting for last {broad,multi}cast pkt"),
3712 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3713 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3714 IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3715 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3716 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3717 "current calculation of % missed beacons"),
3718 IPW2100_ORD(STAT_PERCENT_RETRIES,
3719 "current calculation of % missed tx retries"),
3720 IPW2100_ORD(ASSOCIATED_AP_PTR,
3721 "0 if not associated, else pointer to AP table entry"),
3722 IPW2100_ORD(AVAILABLE_AP_CNT,
3723 "AP's described in the AP table"),
3724 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3725 IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3726 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3727 IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3728 "failures due to response fail"),
3729 IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3730 IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3731 IPW2100_ORD(STAT_ROAM_INHIBIT,
3732 "times roaming was inhibited due to activity"),
3733 IPW2100_ORD(RSSI_AT_ASSN,
3734 "RSSI of associated AP at time of association"),
3735 IPW2100_ORD(STAT_ASSN_CAUSE1,
3736 "reassociation: no probe response or TX on hop"),
3737 IPW2100_ORD(STAT_ASSN_CAUSE2,
3738 "reassociation: poor tx/rx quality"),
3739 IPW2100_ORD(STAT_ASSN_CAUSE3,
3740 "reassociation: tx/rx quality (excessive AP load"),
3741 IPW2100_ORD(STAT_ASSN_CAUSE4,
3742 "reassociation: AP RSSI level"),
3743 IPW2100_ORD(STAT_ASSN_CAUSE5,
3744 "reassociations due to load leveling"),
3745 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3746 IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3747 "times authentication response failed"),
3748 IPW2100_ORD(STATION_TABLE_CNT,
3749 "entries in association table"),
3750 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3751 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3752 IPW2100_ORD(COUNTRY_CODE,
3753 "IEEE country code as recv'd from beacon"),
3754 IPW2100_ORD(COUNTRY_CHANNELS,
3755 "channels supported by country"),
3756 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3757 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3758 IPW2100_ORD(ANTENNA_DIVERSITY,
3759 "TRUE if antenna diversity is disabled"),
3760 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3761 IPW2100_ORD(OUR_FREQ,
3762 "current radio freq lower digits - channel ID"),
3763 IPW2100_ORD(RTC_TIME, "current RTC time"),
3764 IPW2100_ORD(PORT_TYPE, "operating mode"),
3765 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3766 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3767 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3768 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3769 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3770 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3771 IPW2100_ORD(CAPABILITIES,
3772 "Management frame capability field"),
3773 IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3774 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3775 IPW2100_ORD(RTS_THRESHOLD,
3776 "Min packet length for RTS handshaking"),
3777 IPW2100_ORD(INT_MODE, "International mode"),
3778 IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3779 "protocol frag threshold"),
3780 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3781 "EEPROM offset in SRAM"),
3782 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3783 "EEPROM size in SRAM"),
3784 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3785 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3786 "EEPROM IBSS 11b channel set"),
3787 IPW2100_ORD(MAC_VERSION, "MAC Version"),
3788 IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3789 IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3790 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3791 IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3792
3793 static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3794 char *buf)
3795 {
3796 int i;
3797 struct ipw2100_priv *priv = dev_get_drvdata(d);
3798 struct net_device *dev = priv->net_dev;
3799 char *out = buf;
3800 u32 val = 0;
3801
3802 out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
3803
3804 for (i = 0; i < ARRAY_SIZE(hw_data); i++) {
3805 read_register(dev, hw_data[i].addr, &val);
3806 out += sprintf(out, "%30s [%08X] : %08X\n",
3807 hw_data[i].name, hw_data[i].addr, val);
3808 }
3809
3810 return out - buf;
3811 }
3812
3813 static DEVICE_ATTR(registers, 0444, show_registers, NULL);
3814
3815 static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3816 char *buf)
3817 {
3818 struct ipw2100_priv *priv = dev_get_drvdata(d);
3819 struct net_device *dev = priv->net_dev;
3820 char *out = buf;
3821 int i;
3822
3823 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
3824
3825 for (i = 0; i < ARRAY_SIZE(nic_data); i++) {
3826 u8 tmp8;
3827 u16 tmp16;
3828 u32 tmp32;
3829
3830 switch (nic_data[i].size) {
3831 case 1:
3832 read_nic_byte(dev, nic_data[i].addr, &tmp8);
3833 out += sprintf(out, "%30s [%08X] : %02X\n",
3834 nic_data[i].name, nic_data[i].addr,
3835 tmp8);
3836 break;
3837 case 2:
3838 read_nic_word(dev, nic_data[i].addr, &tmp16);
3839 out += sprintf(out, "%30s [%08X] : %04X\n",
3840 nic_data[i].name, nic_data[i].addr,
3841 tmp16);
3842 break;
3843 case 4:
3844 read_nic_dword(dev, nic_data[i].addr, &tmp32);
3845 out += sprintf(out, "%30s [%08X] : %08X\n",
3846 nic_data[i].name, nic_data[i].addr,
3847 tmp32);
3848 break;
3849 }
3850 }
3851 return out - buf;
3852 }
3853
3854 static DEVICE_ATTR(hardware, 0444, show_hardware, NULL);
3855
3856 static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3857 char *buf)
3858 {
3859 struct ipw2100_priv *priv = dev_get_drvdata(d);
3860 struct net_device *dev = priv->net_dev;
3861 static unsigned long loop = 0;
3862 int len = 0;
3863 u32 buffer[4];
3864 int i;
3865 char line[81];
3866
3867 if (loop >= 0x30000)
3868 loop = 0;
3869
3870
3871 while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3872
3873 if (priv->snapshot[0])
3874 for (i = 0; i < 4; i++)
3875 buffer[i] =
3876 *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3877 else
3878 for (i = 0; i < 4; i++)
3879 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3880
3881 if (priv->dump_raw)
3882 len += sprintf(buf + len,
3883 "%c%c%c%c"
3884 "%c%c%c%c"
3885 "%c%c%c%c"
3886 "%c%c%c%c",
3887 ((u8 *) buffer)[0x0],
3888 ((u8 *) buffer)[0x1],
3889 ((u8 *) buffer)[0x2],
3890 ((u8 *) buffer)[0x3],
3891 ((u8 *) buffer)[0x4],
3892 ((u8 *) buffer)[0x5],
3893 ((u8 *) buffer)[0x6],
3894 ((u8 *) buffer)[0x7],
3895 ((u8 *) buffer)[0x8],
3896 ((u8 *) buffer)[0x9],
3897 ((u8 *) buffer)[0xa],
3898 ((u8 *) buffer)[0xb],
3899 ((u8 *) buffer)[0xc],
3900 ((u8 *) buffer)[0xd],
3901 ((u8 *) buffer)[0xe],
3902 ((u8 *) buffer)[0xf]);
3903 else
3904 len += sprintf(buf + len, "%s\n",
3905 snprint_line(line, sizeof(line),
3906 (u8 *) buffer, 16, loop));
3907 loop += 16;
3908 }
3909
3910 return len;
3911 }
3912
3913 static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3914 const char *buf, size_t count)
3915 {
3916 struct ipw2100_priv *priv = dev_get_drvdata(d);
3917 struct net_device *dev = priv->net_dev;
3918 const char *p = buf;
3919
3920 (void)dev;
3921
3922 if (count < 1)
3923 return count;
3924
3925 if (p[0] == '1' ||
3926 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3927 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3928 dev->name);
3929 priv->dump_raw = 1;
3930
3931 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3932 tolower(p[1]) == 'f')) {
3933 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3934 dev->name);
3935 priv->dump_raw = 0;
3936
3937 } else if (tolower(p[0]) == 'r') {
3938 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3939 ipw2100_snapshot_free(priv);
3940
3941 } else
3942 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3943 "reset = clear memory snapshot\n", dev->name);
3944
3945 return count;
3946 }
3947
3948 static DEVICE_ATTR(memory, 0644, show_memory, store_memory);
3949
3950 static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3951 char *buf)
3952 {
3953 struct ipw2100_priv *priv = dev_get_drvdata(d);
3954 u32 val = 0;
3955 int len = 0;
3956 u32 val_len;
3957 static int loop = 0;
3958
3959 if (priv->status & STATUS_RF_KILL_MASK)
3960 return 0;
3961
3962 if (loop >= ARRAY_SIZE(ord_data))
3963 loop = 0;
3964
3965
3966 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) {
3967 val_len = sizeof(u32);
3968
3969 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val,
3970 &val_len))
3971 len += sprintf(buf + len, "[0x%02X] = ERROR %s\n",
3972 ord_data[loop].index,
3973 ord_data[loop].desc);
3974 else
3975 len += sprintf(buf + len, "[0x%02X] = 0x%08X %s\n",
3976 ord_data[loop].index, val,
3977 ord_data[loop].desc);
3978 loop++;
3979 }
3980
3981 return len;
3982 }
3983
3984 static DEVICE_ATTR(ordinals, 0444, show_ordinals, NULL);
3985
3986 static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3987 char *buf)
3988 {
3989 struct ipw2100_priv *priv = dev_get_drvdata(d);
3990 char *out = buf;
3991
3992 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
3993 priv->interrupts, priv->tx_interrupts,
3994 priv->rx_interrupts, priv->inta_other);
3995 out += sprintf(out, "firmware resets: %d\n", priv->resets);
3996 out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
3997 #ifdef CONFIG_IPW2100_DEBUG
3998 out += sprintf(out, "packet mismatch image: %s\n",
3999 priv->snapshot[0] ? "YES" : "NO");
4000 #endif
4001
4002 return out - buf;
4003 }
4004
4005 static DEVICE_ATTR(stats, 0444, show_stats, NULL);
4006
4007 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
4008 {
4009 int err;
4010
4011 if (mode == priv->ieee->iw_mode)
4012 return 0;
4013
4014 err = ipw2100_disable_adapter(priv);
4015 if (err) {
4016 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n",
4017 priv->net_dev->name, err);
4018 return err;
4019 }
4020
4021 switch (mode) {
4022 case IW_MODE_INFRA:
4023 priv->net_dev->type = ARPHRD_ETHER;
4024 break;
4025 case IW_MODE_ADHOC:
4026 priv->net_dev->type = ARPHRD_ETHER;
4027 break;
4028 #ifdef CONFIG_IPW2100_MONITOR
4029 case IW_MODE_MONITOR:
4030 priv->last_mode = priv->ieee->iw_mode;
4031 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
4032 break;
4033 #endif
4034 }
4035
4036 priv->ieee->iw_mode = mode;
4037
4038 #ifdef CONFIG_PM
4039
4040
4041 ipw2100_firmware.version = 0;
4042 #endif
4043
4044 printk(KERN_INFO "%s: Resetting on mode change.\n", priv->net_dev->name);
4045 priv->reset_backoff = 0;
4046 schedule_reset(priv);
4047
4048 return 0;
4049 }
4050
4051 static ssize_t show_internals(struct device *d, struct device_attribute *attr,
4052 char *buf)
4053 {
4054 struct ipw2100_priv *priv = dev_get_drvdata(d);
4055 int len = 0;
4056
4057 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
4058
4059 if (priv->status & STATUS_ASSOCIATED)
4060 len += sprintf(buf + len, "connected: %llu\n",
4061 ktime_get_boottime_seconds() - priv->connect_start);
4062 else
4063 len += sprintf(buf + len, "not connected\n");
4064
4065 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p");
4066 DUMP_VAR(status, "08lx");
4067 DUMP_VAR(config, "08lx");
4068 DUMP_VAR(capability, "08lx");
4069
4070 len +=
4071 sprintf(buf + len, "last_rtc: %lu\n",
4072 (unsigned long)priv->last_rtc);
4073
4074 DUMP_VAR(fatal_error, "d");
4075 DUMP_VAR(stop_hang_check, "d");
4076 DUMP_VAR(stop_rf_kill, "d");
4077 DUMP_VAR(messages_sent, "d");
4078
4079 DUMP_VAR(tx_pend_stat.value, "d");
4080 DUMP_VAR(tx_pend_stat.hi, "d");
4081
4082 DUMP_VAR(tx_free_stat.value, "d");
4083 DUMP_VAR(tx_free_stat.lo, "d");
4084
4085 DUMP_VAR(msg_free_stat.value, "d");
4086 DUMP_VAR(msg_free_stat.lo, "d");
4087
4088 DUMP_VAR(msg_pend_stat.value, "d");
4089 DUMP_VAR(msg_pend_stat.hi, "d");
4090
4091 DUMP_VAR(fw_pend_stat.value, "d");
4092 DUMP_VAR(fw_pend_stat.hi, "d");
4093
4094 DUMP_VAR(txq_stat.value, "d");
4095 DUMP_VAR(txq_stat.lo, "d");
4096
4097 DUMP_VAR(ieee->scans, "d");
4098 DUMP_VAR(reset_backoff, "lld");
4099
4100 return len;
4101 }
4102
4103 static DEVICE_ATTR(internals, 0444, show_internals, NULL);
4104
4105 static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
4106 char *buf)
4107 {
4108 struct ipw2100_priv *priv = dev_get_drvdata(d);
4109 char essid[IW_ESSID_MAX_SIZE + 1];
4110 u8 bssid[ETH_ALEN];
4111 u32 chan = 0;
4112 char *out = buf;
4113 unsigned int length;
4114 int ret;
4115
4116 if (priv->status & STATUS_RF_KILL_MASK)
4117 return 0;
4118
4119 memset(essid, 0, sizeof(essid));
4120 memset(bssid, 0, sizeof(bssid));
4121
4122 length = IW_ESSID_MAX_SIZE;
4123 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length);
4124 if (ret)
4125 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4126 __LINE__);
4127
4128 length = sizeof(bssid);
4129 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
4130 bssid, &length);
4131 if (ret)
4132 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4133 __LINE__);
4134
4135 length = sizeof(u32);
4136 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length);
4137 if (ret)
4138 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4139 __LINE__);
4140
4141 out += sprintf(out, "ESSID: %s\n", essid);
4142 out += sprintf(out, "BSSID: %pM\n", bssid);
4143 out += sprintf(out, "Channel: %d\n", chan);
4144
4145 return out - buf;
4146 }
4147
4148 static DEVICE_ATTR(bssinfo, 0444, show_bssinfo, NULL);
4149
4150 #ifdef CONFIG_IPW2100_DEBUG
4151 static ssize_t debug_level_show(struct device_driver *d, char *buf)
4152 {
4153 return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
4154 }
4155
4156 static ssize_t debug_level_store(struct device_driver *d,
4157 const char *buf, size_t count)
4158 {
4159 u32 val;
4160 int ret;
4161
4162 ret = kstrtou32(buf, 0, &val);
4163 if (ret)
4164 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4165 else
4166 ipw2100_debug_level = val;
4167
4168 return strnlen(buf, count);
4169 }
4170 static DRIVER_ATTR_RW(debug_level);
4171 #endif
4172
4173 static ssize_t show_fatal_error(struct device *d,
4174 struct device_attribute *attr, char *buf)
4175 {
4176 struct ipw2100_priv *priv = dev_get_drvdata(d);
4177 char *out = buf;
4178 int i;
4179
4180 if (priv->fatal_error)
4181 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4182 else
4183 out += sprintf(out, "0\n");
4184
4185 for (i = 1; i <= IPW2100_ERROR_QUEUE; i++) {
4186 if (!priv->fatal_errors[(priv->fatal_index - i) %
4187 IPW2100_ERROR_QUEUE])
4188 continue;
4189
4190 out += sprintf(out, "%d. 0x%08X\n", i,
4191 priv->fatal_errors[(priv->fatal_index - i) %
4192 IPW2100_ERROR_QUEUE]);
4193 }
4194
4195 return out - buf;
4196 }
4197
4198 static ssize_t store_fatal_error(struct device *d,
4199 struct device_attribute *attr, const char *buf,
4200 size_t count)
4201 {
4202 struct ipw2100_priv *priv = dev_get_drvdata(d);
4203 schedule_reset(priv);
4204 return count;
4205 }
4206
4207 static DEVICE_ATTR(fatal_error, 0644, show_fatal_error, store_fatal_error);
4208
4209 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4210 char *buf)
4211 {
4212 struct ipw2100_priv *priv = dev_get_drvdata(d);
4213 return sprintf(buf, "%d\n", priv->ieee->scan_age);
4214 }
4215
4216 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4217 const char *buf, size_t count)
4218 {
4219 struct ipw2100_priv *priv = dev_get_drvdata(d);
4220 struct net_device *dev = priv->net_dev;
4221 unsigned long val;
4222 int ret;
4223
4224 (void)dev;
4225
4226 IPW_DEBUG_INFO("enter\n");
4227
4228 ret = kstrtoul(buf, 0, &val);
4229 if (ret) {
4230 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4231 } else {
4232 priv->ieee->scan_age = val;
4233 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
4234 }
4235
4236 IPW_DEBUG_INFO("exit\n");
4237 return strnlen(buf, count);
4238 }
4239
4240 static DEVICE_ATTR(scan_age, 0644, show_scan_age, store_scan_age);
4241
4242 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4243 char *buf)
4244 {
4245
4246
4247
4248
4249 struct ipw2100_priv *priv = dev_get_drvdata(d);
4250 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4251 (rf_kill_active(priv) ? 0x2 : 0x0);
4252 return sprintf(buf, "%i\n", val);
4253 }
4254
4255 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4256 {
4257 if ((disable_radio ? 1 : 0) ==
4258 (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4259 return 0;
4260
4261 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4262 disable_radio ? "OFF" : "ON");
4263
4264 mutex_lock(&priv->action_mutex);
4265
4266 if (disable_radio) {
4267 priv->status |= STATUS_RF_KILL_SW;
4268 ipw2100_down(priv);
4269 } else {
4270 priv->status &= ~STATUS_RF_KILL_SW;
4271 if (rf_kill_active(priv)) {
4272 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
4273 "disabled by HW switch\n");
4274
4275 priv->stop_rf_kill = 0;
4276 mod_delayed_work(system_wq, &priv->rf_kill,
4277 round_jiffies_relative(HZ));
4278 } else
4279 schedule_reset(priv);
4280 }
4281
4282 mutex_unlock(&priv->action_mutex);
4283 return 1;
4284 }
4285
4286 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4287 const char *buf, size_t count)
4288 {
4289 struct ipw2100_priv *priv = dev_get_drvdata(d);
4290 ipw_radio_kill_sw(priv, buf[0] == '1');
4291 return count;
4292 }
4293
4294 static DEVICE_ATTR(rf_kill, 0644, show_rf_kill, store_rf_kill);
4295
4296 static struct attribute *ipw2100_sysfs_entries[] = {
4297 &dev_attr_hardware.attr,
4298 &dev_attr_registers.attr,
4299 &dev_attr_ordinals.attr,
4300 &dev_attr_pci.attr,
4301 &dev_attr_stats.attr,
4302 &dev_attr_internals.attr,
4303 &dev_attr_bssinfo.attr,
4304 &dev_attr_memory.attr,
4305 &dev_attr_scan_age.attr,
4306 &dev_attr_fatal_error.attr,
4307 &dev_attr_rf_kill.attr,
4308 &dev_attr_cfg.attr,
4309 &dev_attr_status.attr,
4310 &dev_attr_capability.attr,
4311 NULL,
4312 };
4313
4314 static const struct attribute_group ipw2100_attribute_group = {
4315 .attrs = ipw2100_sysfs_entries,
4316 };
4317
4318 static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4319 {
4320 struct ipw2100_status_queue *q = &priv->status_queue;
4321
4322 IPW_DEBUG_INFO("enter\n");
4323
4324 q->size = entries * sizeof(struct ipw2100_status);
4325 q->drv = pci_zalloc_consistent(priv->pci_dev, q->size, &q->nic);
4326 if (!q->drv) {
4327 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4328 return -ENOMEM;
4329 }
4330
4331 IPW_DEBUG_INFO("exit\n");
4332
4333 return 0;
4334 }
4335
4336 static void status_queue_free(struct ipw2100_priv *priv)
4337 {
4338 IPW_DEBUG_INFO("enter\n");
4339
4340 if (priv->status_queue.drv) {
4341 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4342 priv->status_queue.drv,
4343 priv->status_queue.nic);
4344 priv->status_queue.drv = NULL;
4345 }
4346
4347 IPW_DEBUG_INFO("exit\n");
4348 }
4349
4350 static int bd_queue_allocate(struct ipw2100_priv *priv,
4351 struct ipw2100_bd_queue *q, int entries)
4352 {
4353 IPW_DEBUG_INFO("enter\n");
4354
4355 memset(q, 0, sizeof(struct ipw2100_bd_queue));
4356
4357 q->entries = entries;
4358 q->size = entries * sizeof(struct ipw2100_bd);
4359 q->drv = pci_zalloc_consistent(priv->pci_dev, q->size, &q->nic);
4360 if (!q->drv) {
4361 IPW_DEBUG_INFO
4362 ("can't allocate shared memory for buffer descriptors\n");
4363 return -ENOMEM;
4364 }
4365
4366 IPW_DEBUG_INFO("exit\n");
4367
4368 return 0;
4369 }
4370
4371 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4372 {
4373 IPW_DEBUG_INFO("enter\n");
4374
4375 if (!q)
4376 return;
4377
4378 if (q->drv) {
4379 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4380 q->drv = NULL;
4381 }
4382
4383 IPW_DEBUG_INFO("exit\n");
4384 }
4385
4386 static void bd_queue_initialize(struct ipw2100_priv *priv,
4387 struct ipw2100_bd_queue *q, u32 base, u32 size,
4388 u32 r, u32 w)
4389 {
4390 IPW_DEBUG_INFO("enter\n");
4391
4392 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4393 (u32) q->nic);
4394
4395 write_register(priv->net_dev, base, q->nic);
4396 write_register(priv->net_dev, size, q->entries);
4397 write_register(priv->net_dev, r, q->oldest);
4398 write_register(priv->net_dev, w, q->next);
4399
4400 IPW_DEBUG_INFO("exit\n");
4401 }
4402
4403 static void ipw2100_kill_works(struct ipw2100_priv *priv)
4404 {
4405 priv->stop_rf_kill = 1;
4406 priv->stop_hang_check = 1;
4407 cancel_delayed_work_sync(&priv->reset_work);
4408 cancel_delayed_work_sync(&priv->security_work);
4409 cancel_delayed_work_sync(&priv->wx_event_work);
4410 cancel_delayed_work_sync(&priv->hang_check);
4411 cancel_delayed_work_sync(&priv->rf_kill);
4412 cancel_delayed_work_sync(&priv->scan_event);
4413 }
4414
4415 static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4416 {
4417 int i, j, err;
4418 void *v;
4419 dma_addr_t p;
4420
4421 IPW_DEBUG_INFO("enter\n");
4422
4423 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4424 if (err) {
4425 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4426 priv->net_dev->name);
4427 return err;
4428 }
4429
4430 priv->tx_buffers = kmalloc_array(TX_PENDED_QUEUE_LENGTH,
4431 sizeof(struct ipw2100_tx_packet),
4432 GFP_ATOMIC);
4433 if (!priv->tx_buffers) {
4434 bd_queue_free(priv, &priv->tx_queue);
4435 return -ENOMEM;
4436 }
4437
4438 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4439 v = pci_alloc_consistent(priv->pci_dev,
4440 sizeof(struct ipw2100_data_header),
4441 &p);
4442 if (!v) {
4443 printk(KERN_ERR DRV_NAME
4444 ": %s: PCI alloc failed for tx " "buffers.\n",
4445 priv->net_dev->name);
4446 err = -ENOMEM;
4447 break;
4448 }
4449
4450 priv->tx_buffers[i].type = DATA;
4451 priv->tx_buffers[i].info.d_struct.data =
4452 (struct ipw2100_data_header *)v;
4453 priv->tx_buffers[i].info.d_struct.data_phys = p;
4454 priv->tx_buffers[i].info.d_struct.txb = NULL;
4455 }
4456
4457 if (i == TX_PENDED_QUEUE_LENGTH)
4458 return 0;
4459
4460 for (j = 0; j < i; j++) {
4461 pci_free_consistent(priv->pci_dev,
4462 sizeof(struct ipw2100_data_header),
4463 priv->tx_buffers[j].info.d_struct.data,
4464 priv->tx_buffers[j].info.d_struct.
4465 data_phys);
4466 }
4467
4468 kfree(priv->tx_buffers);
4469 priv->tx_buffers = NULL;
4470
4471 return err;
4472 }
4473
4474 static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4475 {
4476 int i;
4477
4478 IPW_DEBUG_INFO("enter\n");
4479
4480
4481
4482
4483 INIT_LIST_HEAD(&priv->fw_pend_list);
4484 INIT_STAT(&priv->fw_pend_stat);
4485
4486
4487
4488
4489 INIT_LIST_HEAD(&priv->tx_pend_list);
4490 INIT_LIST_HEAD(&priv->tx_free_list);
4491 INIT_STAT(&priv->tx_pend_stat);
4492 INIT_STAT(&priv->tx_free_stat);
4493
4494 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4495
4496
4497 if (priv->tx_buffers[i].info.d_struct.txb) {
4498 libipw_txb_free(priv->tx_buffers[i].info.d_struct.
4499 txb);
4500 priv->tx_buffers[i].info.d_struct.txb = NULL;
4501 }
4502
4503 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list);
4504 }
4505
4506 SET_STAT(&priv->tx_free_stat, i);
4507
4508 priv->tx_queue.oldest = 0;
4509 priv->tx_queue.available = priv->tx_queue.entries;
4510 priv->tx_queue.next = 0;
4511 INIT_STAT(&priv->txq_stat);
4512 SET_STAT(&priv->txq_stat, priv->tx_queue.available);
4513
4514 bd_queue_initialize(priv, &priv->tx_queue,
4515 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_BASE,
4516 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_SIZE,
4517 IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
4518 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX);
4519
4520 IPW_DEBUG_INFO("exit\n");
4521
4522 }
4523
4524 static void ipw2100_tx_free(struct ipw2100_priv *priv)
4525 {
4526 int i;
4527
4528 IPW_DEBUG_INFO("enter\n");
4529
4530 bd_queue_free(priv, &priv->tx_queue);
4531
4532 if (!priv->tx_buffers)
4533 return;
4534
4535 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4536 if (priv->tx_buffers[i].info.d_struct.txb) {
4537 libipw_txb_free(priv->tx_buffers[i].info.d_struct.
4538 txb);
4539 priv->tx_buffers[i].info.d_struct.txb = NULL;
4540 }
4541 if (priv->tx_buffers[i].info.d_struct.data)
4542 pci_free_consistent(priv->pci_dev,
4543 sizeof(struct ipw2100_data_header),
4544 priv->tx_buffers[i].info.d_struct.
4545 data,
4546 priv->tx_buffers[i].info.d_struct.
4547 data_phys);
4548 }
4549
4550 kfree(priv->tx_buffers);
4551 priv->tx_buffers = NULL;
4552
4553 IPW_DEBUG_INFO("exit\n");
4554 }
4555
4556 static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4557 {
4558 int i, j, err = -EINVAL;
4559
4560 IPW_DEBUG_INFO("enter\n");
4561
4562 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH);
4563 if (err) {
4564 IPW_DEBUG_INFO("failed bd_queue_allocate\n");
4565 return err;
4566 }
4567
4568 err = status_queue_allocate(priv, RX_QUEUE_LENGTH);
4569 if (err) {
4570 IPW_DEBUG_INFO("failed status_queue_allocate\n");
4571 bd_queue_free(priv, &priv->rx_queue);
4572 return err;
4573 }
4574
4575
4576
4577
4578 priv->rx_buffers = kmalloc_array(RX_QUEUE_LENGTH,
4579 sizeof(struct ipw2100_rx_packet),
4580 GFP_KERNEL);
4581 if (!priv->rx_buffers) {
4582 IPW_DEBUG_INFO("can't allocate rx packet buffer table\n");
4583
4584 bd_queue_free(priv, &priv->rx_queue);
4585
4586 status_queue_free(priv);
4587
4588 return -ENOMEM;
4589 }
4590
4591 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4592 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
4593
4594 err = ipw2100_alloc_skb(priv, packet);
4595 if (unlikely(err)) {
4596 err = -ENOMEM;
4597 break;
4598 }
4599
4600
4601 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
4602 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH;
4603 priv->status_queue.drv[i].status_fields = 0;
4604 }
4605
4606 if (i == RX_QUEUE_LENGTH)
4607 return 0;
4608
4609 for (j = 0; j < i; j++) {
4610 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr,
4611 sizeof(struct ipw2100_rx_packet),
4612 PCI_DMA_FROMDEVICE);
4613 dev_kfree_skb(priv->rx_buffers[j].skb);
4614 }
4615
4616 kfree(priv->rx_buffers);
4617 priv->rx_buffers = NULL;
4618
4619 bd_queue_free(priv, &priv->rx_queue);
4620
4621 status_queue_free(priv);
4622
4623 return err;
4624 }
4625
4626 static void ipw2100_rx_initialize(struct ipw2100_priv *priv)
4627 {
4628 IPW_DEBUG_INFO("enter\n");
4629
4630 priv->rx_queue.oldest = 0;
4631 priv->rx_queue.available = priv->rx_queue.entries - 1;
4632 priv->rx_queue.next = priv->rx_queue.entries - 1;
4633
4634 INIT_STAT(&priv->rxq_stat);
4635 SET_STAT(&priv->rxq_stat, priv->rx_queue.available);
4636
4637 bd_queue_initialize(priv, &priv->rx_queue,
4638 IPW_MEM_HOST_SHARED_RX_BD_BASE,
4639 IPW_MEM_HOST_SHARED_RX_BD_SIZE,
4640 IPW_MEM_HOST_SHARED_RX_READ_INDEX,
4641 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX);
4642
4643
4644 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE,
4645 priv->status_queue.nic);
4646
4647 IPW_DEBUG_INFO("exit\n");
4648 }
4649
4650 static void ipw2100_rx_free(struct ipw2100_priv *priv)
4651 {
4652 int i;
4653
4654 IPW_DEBUG_INFO("enter\n");
4655
4656 bd_queue_free(priv, &priv->rx_queue);
4657 status_queue_free(priv);
4658
4659 if (!priv->rx_buffers)
4660 return;
4661
4662 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4663 if (priv->rx_buffers[i].rxp) {
4664 pci_unmap_single(priv->pci_dev,
4665 priv->rx_buffers[i].dma_addr,
4666 sizeof(struct ipw2100_rx),
4667 PCI_DMA_FROMDEVICE);
4668 dev_kfree_skb(priv->rx_buffers[i].skb);
4669 }
4670 }
4671
4672 kfree(priv->rx_buffers);
4673 priv->rx_buffers = NULL;
4674
4675 IPW_DEBUG_INFO("exit\n");
4676 }
4677
4678 static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4679 {
4680 u32 length = ETH_ALEN;
4681 u8 addr[ETH_ALEN];
4682
4683 int err;
4684
4685 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, addr, &length);
4686 if (err) {
4687 IPW_DEBUG_INFO("MAC address read failed\n");
4688 return -EIO;
4689 }
4690
4691 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN);
4692 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr);
4693
4694 return 0;
4695 }
4696
4697
4698
4699
4700
4701
4702
4703 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4704 {
4705 struct host_command cmd = {
4706 .host_command = ADAPTER_ADDRESS,
4707 .host_command_sequence = 0,
4708 .host_command_length = ETH_ALEN
4709 };
4710 int err;
4711
4712 IPW_DEBUG_HC("SET_MAC_ADDRESS\n");
4713
4714 IPW_DEBUG_INFO("enter\n");
4715
4716 if (priv->config & CFG_CUSTOM_MAC) {
4717 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4718 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4719 } else
4720 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
4721 ETH_ALEN);
4722
4723 err = ipw2100_hw_send_command(priv, &cmd);
4724
4725 IPW_DEBUG_INFO("exit\n");
4726 return err;
4727 }
4728
4729 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4730 int batch_mode)
4731 {
4732 struct host_command cmd = {
4733 .host_command = PORT_TYPE,
4734 .host_command_sequence = 0,
4735 .host_command_length = sizeof(u32)
4736 };
4737 int err;
4738
4739 switch (port_type) {
4740 case IW_MODE_INFRA:
4741 cmd.host_command_parameters[0] = IPW_BSS;
4742 break;
4743 case IW_MODE_ADHOC:
4744 cmd.host_command_parameters[0] = IPW_IBSS;
4745 break;
4746 }
4747
4748 IPW_DEBUG_HC("PORT_TYPE: %s\n",
4749 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed");
4750
4751 if (!batch_mode) {
4752 err = ipw2100_disable_adapter(priv);
4753 if (err) {
4754 printk(KERN_ERR DRV_NAME
4755 ": %s: Could not disable adapter %d\n",
4756 priv->net_dev->name, err);
4757 return err;
4758 }
4759 }
4760
4761
4762 err = ipw2100_hw_send_command(priv, &cmd);
4763
4764 if (!batch_mode)
4765 ipw2100_enable_adapter(priv);
4766
4767 return err;
4768 }
4769
4770 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4771 int batch_mode)
4772 {
4773 struct host_command cmd = {
4774 .host_command = CHANNEL,
4775 .host_command_sequence = 0,
4776 .host_command_length = sizeof(u32)
4777 };
4778 int err;
4779
4780 cmd.host_command_parameters[0] = channel;
4781
4782 IPW_DEBUG_HC("CHANNEL: %d\n", channel);
4783
4784
4785 if (priv->ieee->iw_mode == IW_MODE_INFRA)
4786 return 0;
4787
4788 if ((channel != 0) &&
4789 ((channel < REG_MIN_CHANNEL) || (channel > REG_MAX_CHANNEL)))
4790 return -EINVAL;
4791
4792 if (!batch_mode) {
4793 err = ipw2100_disable_adapter(priv);
4794 if (err)
4795 return err;
4796 }
4797
4798 err = ipw2100_hw_send_command(priv, &cmd);
4799 if (err) {
4800 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4801 return err;
4802 }
4803
4804 if (channel)
4805 priv->config |= CFG_STATIC_CHANNEL;
4806 else
4807 priv->config &= ~CFG_STATIC_CHANNEL;
4808
4809 priv->channel = channel;
4810
4811 if (!batch_mode) {
4812 err = ipw2100_enable_adapter(priv);
4813 if (err)
4814 return err;
4815 }
4816
4817 return 0;
4818 }
4819
4820 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4821 {
4822 struct host_command cmd = {
4823 .host_command = SYSTEM_CONFIG,
4824 .host_command_sequence = 0,
4825 .host_command_length = 12,
4826 };
4827 u32 ibss_mask, len = sizeof(u32);
4828 int err;
4829
4830
4831
4832 if (!batch_mode) {
4833 err = ipw2100_disable_adapter(priv);
4834 if (err)
4835 return err;
4836 }
4837
4838 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
4839 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4840
4841 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4842 IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4843
4844 if (!(priv->config & CFG_LONG_PREAMBLE))
4845 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4846
4847 err = ipw2100_get_ordinal(priv,
4848 IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4849 &ibss_mask, &len);
4850 if (err)
4851 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4852
4853 cmd.host_command_parameters[1] = REG_CHANNEL_MASK;
4854 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4855
4856
4857
4858
4859 err = ipw2100_hw_send_command(priv, &cmd);
4860 if (err)
4861 return err;
4862
4863
4864
4865 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
4866 cmd.host_command = ADD_MULTICAST;
4867 cmd.host_command_sequence = 0;
4868 cmd.host_command_length = 0;
4869
4870 ipw2100_hw_send_command(priv, &cmd);
4871 #endif
4872 if (!batch_mode) {
4873 err = ipw2100_enable_adapter(priv);
4874 if (err)
4875 return err;
4876 }
4877
4878 return 0;
4879 }
4880
4881 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4882 int batch_mode)
4883 {
4884 struct host_command cmd = {
4885 .host_command = BASIC_TX_RATES,
4886 .host_command_sequence = 0,
4887 .host_command_length = 4
4888 };
4889 int err;
4890
4891 cmd.host_command_parameters[0] = rate & TX_RATE_MASK;
4892
4893 if (!batch_mode) {
4894 err = ipw2100_disable_adapter(priv);
4895 if (err)
4896 return err;
4897 }
4898
4899
4900 ipw2100_hw_send_command(priv, &cmd);
4901
4902
4903 cmd.host_command = TX_RATES;
4904 ipw2100_hw_send_command(priv, &cmd);
4905
4906
4907 cmd.host_command = MSDU_TX_RATES;
4908 ipw2100_hw_send_command(priv, &cmd);
4909
4910 if (!batch_mode) {
4911 err = ipw2100_enable_adapter(priv);
4912 if (err)
4913 return err;
4914 }
4915
4916 priv->tx_rates = rate;
4917
4918 return 0;
4919 }
4920
4921 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4922 {
4923 struct host_command cmd = {
4924 .host_command = POWER_MODE,
4925 .host_command_sequence = 0,
4926 .host_command_length = 4
4927 };
4928 int err;
4929
4930 cmd.host_command_parameters[0] = power_level;
4931
4932 err = ipw2100_hw_send_command(priv, &cmd);
4933 if (err)
4934 return err;
4935
4936 if (power_level == IPW_POWER_MODE_CAM)
4937 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
4938 else
4939 priv->power_mode = IPW_POWER_ENABLED | power_level;
4940
4941 #ifdef IPW2100_TX_POWER
4942 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4943
4944 cmd.host_command = TX_POWER_INDEX;
4945 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4946
4947 err = ipw2100_hw_send_command(priv, &cmd);
4948 if (err)
4949 return err;
4950 }
4951 #endif
4952
4953 return 0;
4954 }
4955
4956 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4957 {
4958 struct host_command cmd = {
4959 .host_command = RTS_THRESHOLD,
4960 .host_command_sequence = 0,
4961 .host_command_length = 4
4962 };
4963 int err;
4964
4965 if (threshold & RTS_DISABLED)
4966 cmd.host_command_parameters[0] = MAX_RTS_THRESHOLD;
4967 else
4968 cmd.host_command_parameters[0] = threshold & ~RTS_DISABLED;
4969
4970 err = ipw2100_hw_send_command(priv, &cmd);
4971 if (err)
4972 return err;
4973
4974 priv->rts_threshold = threshold;
4975
4976 return 0;
4977 }
4978
4979 #if 0
4980 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
4981 u32 threshold, int batch_mode)
4982 {
4983 struct host_command cmd = {
4984 .host_command = FRAG_THRESHOLD,
4985 .host_command_sequence = 0,
4986 .host_command_length = 4,
4987 .host_command_parameters[0] = 0,
4988 };
4989 int err;
4990
4991 if (!batch_mode) {
4992 err = ipw2100_disable_adapter(priv);
4993 if (err)
4994 return err;
4995 }
4996
4997 if (threshold == 0)
4998 threshold = DEFAULT_FRAG_THRESHOLD;
4999 else {
5000 threshold = max(threshold, MIN_FRAG_THRESHOLD);
5001 threshold = min(threshold, MAX_FRAG_THRESHOLD);
5002 }
5003
5004 cmd.host_command_parameters[0] = threshold;
5005
5006 IPW_DEBUG_HC("FRAG_THRESHOLD: %u\n", threshold);
5007
5008 err = ipw2100_hw_send_command(priv, &cmd);
5009
5010 if (!batch_mode)
5011 ipw2100_enable_adapter(priv);
5012
5013 if (!err)
5014 priv->frag_threshold = threshold;
5015
5016 return err;
5017 }
5018 #endif
5019
5020 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry)
5021 {
5022 struct host_command cmd = {
5023 .host_command = SHORT_RETRY_LIMIT,
5024 .host_command_sequence = 0,
5025 .host_command_length = 4
5026 };
5027 int err;
5028
5029 cmd.host_command_parameters[0] = retry;
5030
5031 err = ipw2100_hw_send_command(priv, &cmd);
5032 if (err)
5033 return err;
5034
5035 priv->short_retry_limit = retry;
5036
5037 return 0;
5038 }
5039
5040 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
5041 {
5042 struct host_command cmd = {
5043 .host_command = LONG_RETRY_LIMIT,
5044 .host_command_sequence = 0,
5045 .host_command_length = 4
5046 };
5047 int err;
5048
5049 cmd.host_command_parameters[0] = retry;
5050
5051 err = ipw2100_hw_send_command(priv, &cmd);
5052 if (err)
5053 return err;
5054
5055 priv->long_retry_limit = retry;
5056
5057 return 0;
5058 }
5059
5060 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
5061 int batch_mode)
5062 {
5063 struct host_command cmd = {
5064 .host_command = MANDATORY_BSSID,
5065 .host_command_sequence = 0,
5066 .host_command_length = (bssid == NULL) ? 0 : ETH_ALEN
5067 };
5068 int err;
5069
5070 #ifdef CONFIG_IPW2100_DEBUG
5071 if (bssid != NULL)
5072 IPW_DEBUG_HC("MANDATORY_BSSID: %pM\n", bssid);
5073 else
5074 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
5075 #endif
5076
5077 if (bssid != NULL)
5078 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
5079
5080 if (!batch_mode) {
5081 err = ipw2100_disable_adapter(priv);
5082 if (err)
5083 return err;
5084 }
5085
5086 err = ipw2100_hw_send_command(priv, &cmd);
5087
5088 if (!batch_mode)
5089 ipw2100_enable_adapter(priv);
5090
5091 return err;
5092 }
5093
5094 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
5095 {
5096 struct host_command cmd = {
5097 .host_command = DISASSOCIATION_BSSID,
5098 .host_command_sequence = 0,
5099 .host_command_length = ETH_ALEN
5100 };
5101 int err;
5102
5103 IPW_DEBUG_HC("DISASSOCIATION_BSSID\n");
5104
5105
5106
5107
5108
5109 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN);
5110
5111 err = ipw2100_hw_send_command(priv, &cmd);
5112
5113 return err;
5114 }
5115
5116 static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
5117 struct ipw2100_wpa_assoc_frame *, int)
5118 __attribute__ ((unused));
5119
5120 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
5121 struct ipw2100_wpa_assoc_frame *wpa_frame,
5122 int batch_mode)
5123 {
5124 struct host_command cmd = {
5125 .host_command = SET_WPA_IE,
5126 .host_command_sequence = 0,
5127 .host_command_length = sizeof(struct ipw2100_wpa_assoc_frame),
5128 };
5129 int err;
5130
5131 IPW_DEBUG_HC("SET_WPA_IE\n");
5132
5133 if (!batch_mode) {
5134 err = ipw2100_disable_adapter(priv);
5135 if (err)
5136 return err;
5137 }
5138
5139 memcpy(cmd.host_command_parameters, wpa_frame,
5140 sizeof(struct ipw2100_wpa_assoc_frame));
5141
5142 err = ipw2100_hw_send_command(priv, &cmd);
5143
5144 if (!batch_mode) {
5145 if (ipw2100_enable_adapter(priv))
5146 err = -EIO;
5147 }
5148
5149 return err;
5150 }
5151
5152 struct security_info_params {
5153 u32 allowed_ciphers;
5154 u16 version;
5155 u8 auth_mode;
5156 u8 replay_counters_number;
5157 u8 unicast_using_group;
5158 } __packed;
5159
5160 static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5161 int auth_mode,
5162 int security_level,
5163 int unicast_using_group,
5164 int batch_mode)
5165 {
5166 struct host_command cmd = {
5167 .host_command = SET_SECURITY_INFORMATION,
5168 .host_command_sequence = 0,
5169 .host_command_length = sizeof(struct security_info_params)
5170 };
5171 struct security_info_params *security =
5172 (struct security_info_params *)&cmd.host_command_parameters;
5173 int err;
5174 memset(security, 0, sizeof(*security));
5175
5176
5177
5178
5179
5180 security->auth_mode = auth_mode;
5181 security->unicast_using_group = unicast_using_group;
5182
5183 switch (security_level) {
5184 default:
5185 case SEC_LEVEL_0:
5186 security->allowed_ciphers = IPW_NONE_CIPHER;
5187 break;
5188 case SEC_LEVEL_1:
5189 security->allowed_ciphers = IPW_WEP40_CIPHER |
5190 IPW_WEP104_CIPHER;
5191 break;
5192 case SEC_LEVEL_2:
5193 security->allowed_ciphers = IPW_WEP40_CIPHER |
5194 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5195 break;
5196 case SEC_LEVEL_2_CKIP:
5197 security->allowed_ciphers = IPW_WEP40_CIPHER |
5198 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5199 break;
5200 case SEC_LEVEL_3:
5201 security->allowed_ciphers = IPW_WEP40_CIPHER |
5202 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5203 break;
5204 }
5205
5206 IPW_DEBUG_HC
5207 ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5208 security->auth_mode, security->allowed_ciphers, security_level);
5209
5210 security->replay_counters_number = 0;
5211
5212 if (!batch_mode) {
5213 err = ipw2100_disable_adapter(priv);
5214 if (err)
5215 return err;
5216 }
5217
5218 err = ipw2100_hw_send_command(priv, &cmd);
5219
5220 if (!batch_mode)
5221 ipw2100_enable_adapter(priv);
5222
5223 return err;
5224 }
5225
5226 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5227 {
5228 struct host_command cmd = {
5229 .host_command = TX_POWER_INDEX,
5230 .host_command_sequence = 0,
5231 .host_command_length = 4
5232 };
5233 int err = 0;
5234 u32 tmp = tx_power;
5235
5236 if (tx_power != IPW_TX_POWER_DEFAULT)
5237 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5238 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5239
5240 cmd.host_command_parameters[0] = tmp;
5241
5242 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
5243 err = ipw2100_hw_send_command(priv, &cmd);
5244 if (!err)
5245 priv->tx_power = tx_power;
5246
5247 return 0;
5248 }
5249
5250 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5251 u32 interval, int batch_mode)
5252 {
5253 struct host_command cmd = {
5254 .host_command = BEACON_INTERVAL,
5255 .host_command_sequence = 0,
5256 .host_command_length = 4
5257 };
5258 int err;
5259
5260 cmd.host_command_parameters[0] = interval;
5261
5262 IPW_DEBUG_INFO("enter\n");
5263
5264 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5265 if (!batch_mode) {
5266 err = ipw2100_disable_adapter(priv);
5267 if (err)
5268 return err;
5269 }
5270
5271 ipw2100_hw_send_command(priv, &cmd);
5272
5273 if (!batch_mode) {
5274 err = ipw2100_enable_adapter(priv);
5275 if (err)
5276 return err;
5277 }
5278 }
5279
5280 IPW_DEBUG_INFO("exit\n");
5281
5282 return 0;
5283 }
5284
5285 static void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5286 {
5287 ipw2100_tx_initialize(priv);
5288 ipw2100_rx_initialize(priv);
5289 ipw2100_msg_initialize(priv);
5290 }
5291
5292 static void ipw2100_queues_free(struct ipw2100_priv *priv)
5293 {
5294 ipw2100_tx_free(priv);
5295 ipw2100_rx_free(priv);
5296 ipw2100_msg_free(priv);
5297 }
5298
5299 static int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5300 {
5301 if (ipw2100_tx_allocate(priv) ||
5302 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5303 goto fail;
5304
5305 return 0;
5306
5307 fail:
5308 ipw2100_tx_free(priv);
5309 ipw2100_rx_free(priv);
5310 ipw2100_msg_free(priv);
5311 return -ENOMEM;
5312 }
5313
5314 #define IPW_PRIVACY_CAPABLE 0x0008
5315
5316 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5317 int batch_mode)
5318 {
5319 struct host_command cmd = {
5320 .host_command = WEP_FLAGS,
5321 .host_command_sequence = 0,
5322 .host_command_length = 4
5323 };
5324 int err;
5325
5326 cmd.host_command_parameters[0] = flags;
5327
5328 IPW_DEBUG_HC("WEP_FLAGS: flags = 0x%08X\n", flags);
5329
5330 if (!batch_mode) {
5331 err = ipw2100_disable_adapter(priv);
5332 if (err) {
5333 printk(KERN_ERR DRV_NAME
5334 ": %s: Could not disable adapter %d\n",
5335 priv->net_dev->name, err);
5336 return err;
5337 }
5338 }
5339
5340
5341 err = ipw2100_hw_send_command(priv, &cmd);
5342
5343 if (!batch_mode)
5344 ipw2100_enable_adapter(priv);
5345
5346 return err;
5347 }
5348
5349 struct ipw2100_wep_key {
5350 u8 idx;
5351 u8 len;
5352 u8 key[13];
5353 };
5354
5355
5356 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5357 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5358 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5359 #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]
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376 static int ipw2100_set_key(struct ipw2100_priv *priv,
5377 int idx, char *key, int len, int batch_mode)
5378 {
5379 int keylen = len ? (len <= 5 ? 5 : 13) : 0;
5380 struct host_command cmd = {
5381 .host_command = WEP_KEY_INFO,
5382 .host_command_sequence = 0,
5383 .host_command_length = sizeof(struct ipw2100_wep_key),
5384 };
5385 struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5386 int err;
5387
5388 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5389 idx, keylen, len);
5390
5391
5392
5393
5394
5395 wep_key->idx = idx;
5396 wep_key->len = keylen;
5397
5398 if (keylen) {
5399 memcpy(wep_key->key, key, len);
5400 memset(wep_key->key + len, 0, keylen - len);
5401 }
5402
5403
5404 if (keylen == 0)
5405 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5406 priv->net_dev->name, wep_key->idx);
5407 else if (keylen == 5)
5408 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5409 priv->net_dev->name, wep_key->idx, wep_key->len,
5410 WEP_STR_64(wep_key->key));
5411 else
5412 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5413 "\n",
5414 priv->net_dev->name, wep_key->idx, wep_key->len,
5415 WEP_STR_128(wep_key->key));
5416
5417 if (!batch_mode) {
5418 err = ipw2100_disable_adapter(priv);
5419
5420 if (err) {
5421 printk(KERN_ERR DRV_NAME
5422 ": %s: Could not disable adapter %d\n",
5423 priv->net_dev->name, err);
5424 return err;
5425 }
5426 }
5427
5428
5429 err = ipw2100_hw_send_command(priv, &cmd);
5430
5431 if (!batch_mode) {
5432 int err2 = ipw2100_enable_adapter(priv);
5433 if (err == 0)
5434 err = err2;
5435 }
5436 return err;
5437 }
5438
5439 static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5440 int idx, int batch_mode)
5441 {
5442 struct host_command cmd = {
5443 .host_command = WEP_KEY_INDEX,
5444 .host_command_sequence = 0,
5445 .host_command_length = 4,
5446 .host_command_parameters = {idx},
5447 };
5448 int err;
5449
5450 IPW_DEBUG_HC("WEP_KEY_INDEX: index = %d\n", idx);
5451
5452 if (idx < 0 || idx > 3)
5453 return -EINVAL;
5454
5455 if (!batch_mode) {
5456 err = ipw2100_disable_adapter(priv);
5457 if (err) {
5458 printk(KERN_ERR DRV_NAME
5459 ": %s: Could not disable adapter %d\n",
5460 priv->net_dev->name, err);
5461 return err;
5462 }
5463 }
5464
5465
5466 err = ipw2100_hw_send_command(priv, &cmd);
5467
5468 if (!batch_mode)
5469 ipw2100_enable_adapter(priv);
5470
5471 return err;
5472 }
5473
5474 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5475 {
5476 int i, err, auth_mode, sec_level, use_group;
5477
5478 if (!(priv->status & STATUS_RUNNING))
5479 return 0;
5480
5481 if (!batch_mode) {
5482 err = ipw2100_disable_adapter(priv);
5483 if (err)
5484 return err;
5485 }
5486
5487 if (!priv->ieee->sec.enabled) {
5488 err =
5489 ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5490 SEC_LEVEL_0, 0, 1);
5491 } else {
5492 auth_mode = IPW_AUTH_OPEN;
5493 if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
5494 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
5495 auth_mode = IPW_AUTH_SHARED;
5496 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
5497 auth_mode = IPW_AUTH_LEAP_CISCO_ID;
5498 }
5499
5500 sec_level = SEC_LEVEL_0;
5501 if (priv->ieee->sec.flags & SEC_LEVEL)
5502 sec_level = priv->ieee->sec.level;
5503
5504 use_group = 0;
5505 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5506 use_group = priv->ieee->sec.unicast_uses_group;
5507
5508 err =
5509 ipw2100_set_security_information(priv, auth_mode, sec_level,
5510 use_group, 1);
5511 }
5512
5513 if (err)
5514 goto exit;
5515
5516 if (priv->ieee->sec.enabled) {
5517 for (i = 0; i < 4; i++) {
5518 if (!(priv->ieee->sec.flags & (1 << i))) {
5519 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5520 priv->ieee->sec.key_sizes[i] = 0;
5521 } else {
5522 err = ipw2100_set_key(priv, i,
5523 priv->ieee->sec.keys[i],
5524 priv->ieee->sec.
5525 key_sizes[i], 1);
5526 if (err)
5527 goto exit;
5528 }
5529 }
5530
5531 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1);
5532 }
5533
5534
5535
5536 err =
5537 ipw2100_set_wep_flags(priv,
5538 priv->ieee->sec.
5539 enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5540 if (err)
5541 goto exit;
5542
5543 priv->status &= ~STATUS_SECURITY_UPDATED;
5544
5545 exit:
5546 if (!batch_mode)
5547 ipw2100_enable_adapter(priv);
5548
5549 return err;
5550 }
5551
5552 static void ipw2100_security_work(struct work_struct *work)
5553 {
5554 struct ipw2100_priv *priv =
5555 container_of(work, struct ipw2100_priv, security_work.work);
5556
5557
5558
5559
5560 if (!(priv->status & STATUS_ASSOCIATED) &&
5561 priv->status & STATUS_SECURITY_UPDATED)
5562 ipw2100_configure_security(priv, 0);
5563 }
5564
5565 static void shim__set_security(struct net_device *dev,
5566 struct libipw_security *sec)
5567 {
5568 struct ipw2100_priv *priv = libipw_priv(dev);
5569 int i, force_update = 0;
5570
5571 mutex_lock(&priv->action_mutex);
5572 if (!(priv->status & STATUS_INITIALIZED))
5573 goto done;
5574
5575 for (i = 0; i < 4; i++) {
5576 if (sec->flags & (1 << i)) {
5577 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5578 if (sec->key_sizes[i] == 0)
5579 priv->ieee->sec.flags &= ~(1 << i);
5580 else
5581 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5582 sec->key_sizes[i]);
5583 if (sec->level == SEC_LEVEL_1) {
5584 priv->ieee->sec.flags |= (1 << i);
5585 priv->status |= STATUS_SECURITY_UPDATED;
5586 } else
5587 priv->ieee->sec.flags &= ~(1 << i);
5588 }
5589 }
5590
5591 if ((sec->flags & SEC_ACTIVE_KEY) &&
5592 priv->ieee->sec.active_key != sec->active_key) {
5593 priv->ieee->sec.active_key = sec->active_key;
5594 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5595 priv->status |= STATUS_SECURITY_UPDATED;
5596 }
5597
5598 if ((sec->flags & SEC_AUTH_MODE) &&
5599 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5600 priv->ieee->sec.auth_mode = sec->auth_mode;
5601 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5602 priv->status |= STATUS_SECURITY_UPDATED;
5603 }
5604
5605 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5606 priv->ieee->sec.flags |= SEC_ENABLED;
5607 priv->ieee->sec.enabled = sec->enabled;
5608 priv->status |= STATUS_SECURITY_UPDATED;
5609 force_update = 1;
5610 }
5611
5612 if (sec->flags & SEC_ENCRYPT)
5613 priv->ieee->sec.encrypt = sec->encrypt;
5614
5615 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5616 priv->ieee->sec.level = sec->level;
5617 priv->ieee->sec.flags |= SEC_LEVEL;
5618 priv->status |= STATUS_SECURITY_UPDATED;
5619 }
5620
5621 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5622 priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5623 priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5624 priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5625 priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5626 priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5627 priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5628 priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5629 priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5630 priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5631
5632
5633
5634
5635
5636
5637 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5638 ipw2100_configure_security(priv, 0);
5639 done:
5640 mutex_unlock(&priv->action_mutex);
5641 }
5642
5643 static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5644 {
5645 int err;
5646 int batch_mode = 1;
5647 u8 *bssid;
5648
5649 IPW_DEBUG_INFO("enter\n");
5650
5651 err = ipw2100_disable_adapter(priv);
5652 if (err)
5653 return err;
5654 #ifdef CONFIG_IPW2100_MONITOR
5655 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5656 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5657 if (err)
5658 return err;
5659
5660 IPW_DEBUG_INFO("exit\n");
5661
5662 return 0;
5663 }
5664 #endif
5665
5666 err = ipw2100_read_mac_address(priv);
5667 if (err)
5668 return -EIO;
5669
5670 err = ipw2100_set_mac_address(priv, batch_mode);
5671 if (err)
5672 return err;
5673
5674 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode);
5675 if (err)
5676 return err;
5677
5678 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5679 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5680 if (err)
5681 return err;
5682 }
5683
5684 err = ipw2100_system_config(priv, batch_mode);
5685 if (err)
5686 return err;
5687
5688 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode);
5689 if (err)
5690 return err;
5691
5692
5693 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
5694 if (err)
5695 return err;
5696
5697 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold);
5698 if (err)
5699 return err;
5700
5701 if (priv->config & CFG_STATIC_BSSID)
5702 bssid = priv->bssid;
5703 else
5704 bssid = NULL;
5705 err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode);
5706 if (err)
5707 return err;
5708
5709 if (priv->config & CFG_STATIC_ESSID)
5710 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len,
5711 batch_mode);
5712 else
5713 err = ipw2100_set_essid(priv, NULL, 0, batch_mode);
5714 if (err)
5715 return err;
5716
5717 err = ipw2100_configure_security(priv, batch_mode);
5718 if (err)
5719 return err;
5720
5721 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5722 err =
5723 ipw2100_set_ibss_beacon_interval(priv,
5724 priv->beacon_interval,
5725 batch_mode);
5726 if (err)
5727 return err;
5728
5729 err = ipw2100_set_tx_power(priv, priv->tx_power);
5730 if (err)
5731 return err;
5732 }
5733
5734
5735
5736
5737
5738
5739
5740
5741 IPW_DEBUG_INFO("exit\n");
5742
5743 return 0;
5744 }
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755 static int ipw2100_set_address(struct net_device *dev, void *p)
5756 {
5757 struct ipw2100_priv *priv = libipw_priv(dev);
5758 struct sockaddr *addr = p;
5759 int err = 0;
5760
5761 if (!is_valid_ether_addr(addr->sa_data))
5762 return -EADDRNOTAVAIL;
5763
5764 mutex_lock(&priv->action_mutex);
5765
5766 priv->config |= CFG_CUSTOM_MAC;
5767 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
5768
5769 err = ipw2100_set_mac_address(priv, 0);
5770 if (err)
5771 goto done;
5772
5773 priv->reset_backoff = 0;
5774 mutex_unlock(&priv->action_mutex);
5775 ipw2100_reset_adapter(&priv->reset_work.work);
5776 return 0;
5777
5778 done:
5779 mutex_unlock(&priv->action_mutex);
5780 return err;
5781 }
5782
5783 static int ipw2100_open(struct net_device *dev)
5784 {
5785 struct ipw2100_priv *priv = libipw_priv(dev);
5786 unsigned long flags;
5787 IPW_DEBUG_INFO("dev->open\n");
5788
5789 spin_lock_irqsave(&priv->low_lock, flags);
5790 if (priv->status & STATUS_ASSOCIATED) {
5791 netif_carrier_on(dev);
5792 netif_start_queue(dev);
5793 }
5794 spin_unlock_irqrestore(&priv->low_lock, flags);
5795
5796 return 0;
5797 }
5798
5799 static int ipw2100_close(struct net_device *dev)
5800 {
5801 struct ipw2100_priv *priv = libipw_priv(dev);
5802 unsigned long flags;
5803 struct list_head *element;
5804 struct ipw2100_tx_packet *packet;
5805
5806 IPW_DEBUG_INFO("enter\n");
5807
5808 spin_lock_irqsave(&priv->low_lock, flags);
5809
5810 if (priv->status & STATUS_ASSOCIATED)
5811 netif_carrier_off(dev);
5812 netif_stop_queue(dev);
5813
5814
5815 while (!list_empty(&priv->tx_pend_list)) {
5816 element = priv->tx_pend_list.next;
5817 packet = list_entry(element, struct ipw2100_tx_packet, list);
5818
5819 list_del(element);
5820 DEC_STAT(&priv->tx_pend_stat);
5821
5822 libipw_txb_free(packet->info.d_struct.txb);
5823 packet->info.d_struct.txb = NULL;
5824
5825 list_add_tail(element, &priv->tx_free_list);
5826 INC_STAT(&priv->tx_free_stat);
5827 }
5828 spin_unlock_irqrestore(&priv->low_lock, flags);
5829
5830 IPW_DEBUG_INFO("exit\n");
5831
5832 return 0;
5833 }
5834
5835
5836
5837
5838 static void ipw2100_tx_timeout(struct net_device *dev)
5839 {
5840 struct ipw2100_priv *priv = libipw_priv(dev);
5841
5842 dev->stats.tx_errors++;
5843
5844 #ifdef CONFIG_IPW2100_MONITOR
5845 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5846 return;
5847 #endif
5848
5849 IPW_DEBUG_INFO("%s: TX timed out. Scheduling firmware restart.\n",
5850 dev->name);
5851 schedule_reset(priv);
5852 }
5853
5854 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5855 {
5856
5857
5858 priv->ieee->wpa_enabled = value;
5859 return 0;
5860 }
5861
5862 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5863 {
5864
5865 struct libipw_device *ieee = priv->ieee;
5866 struct libipw_security sec = {
5867 .flags = SEC_AUTH_MODE,
5868 };
5869 int ret = 0;
5870
5871 if (value & IW_AUTH_ALG_SHARED_KEY) {
5872 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5873 ieee->open_wep = 0;
5874 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5875 sec.auth_mode = WLAN_AUTH_OPEN;
5876 ieee->open_wep = 1;
5877 } else if (value & IW_AUTH_ALG_LEAP) {
5878 sec.auth_mode = WLAN_AUTH_LEAP;
5879 ieee->open_wep = 1;
5880 } else
5881 return -EINVAL;
5882
5883 if (ieee->set_security)
5884 ieee->set_security(ieee->dev, &sec);
5885 else
5886 ret = -EOPNOTSUPP;
5887
5888 return ret;
5889 }
5890
5891 static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5892 char *wpa_ie, int wpa_ie_len)
5893 {
5894
5895 struct ipw2100_wpa_assoc_frame frame;
5896
5897 frame.fixed_ie_mask = 0;
5898
5899
5900 memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5901 frame.var_ie_len = wpa_ie_len;
5902
5903
5904 ipw2100_wpa_enable(priv, 1);
5905 ipw2100_set_wpa_ie(priv, &frame, 0);
5906 }
5907
5908 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
5909 struct ethtool_drvinfo *info)
5910 {
5911 struct ipw2100_priv *priv = libipw_priv(dev);
5912 char fw_ver[64], ucode_ver[64];
5913
5914 strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
5915 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
5916
5917 ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver));
5918 ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver));
5919
5920 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s",
5921 fw_ver, priv->eeprom_version, ucode_ver);
5922
5923 strlcpy(info->bus_info, pci_name(priv->pci_dev),
5924 sizeof(info->bus_info));
5925 }
5926
5927 static u32 ipw2100_ethtool_get_link(struct net_device *dev)
5928 {
5929 struct ipw2100_priv *priv = libipw_priv(dev);
5930 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
5931 }
5932
5933 static const struct ethtool_ops ipw2100_ethtool_ops = {
5934 .get_link = ipw2100_ethtool_get_link,
5935 .get_drvinfo = ipw_ethtool_get_drvinfo,
5936 };
5937
5938 static void ipw2100_hang_check(struct work_struct *work)
5939 {
5940 struct ipw2100_priv *priv =
5941 container_of(work, struct ipw2100_priv, hang_check.work);
5942 unsigned long flags;
5943 u32 rtc = 0xa5a5a5a5;
5944 u32 len = sizeof(rtc);
5945 int restart = 0;
5946
5947 spin_lock_irqsave(&priv->low_lock, flags);
5948
5949 if (priv->fatal_error != 0) {
5950
5951 IPW_DEBUG_INFO("%s: Hardware fatal error detected.\n",
5952 priv->net_dev->name);
5953
5954 restart = 1;
5955 } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) ||
5956 (rtc == priv->last_rtc)) {
5957
5958 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5959 priv->net_dev->name);
5960
5961 restart = 1;
5962 }
5963
5964 if (restart) {
5965
5966 priv->stop_hang_check = 1;
5967 priv->hangs++;
5968
5969
5970 schedule_reset(priv);
5971 }
5972
5973 priv->last_rtc = rtc;
5974
5975 if (!priv->stop_hang_check)
5976 schedule_delayed_work(&priv->hang_check, HZ / 2);
5977
5978 spin_unlock_irqrestore(&priv->low_lock, flags);
5979 }
5980
5981 static void ipw2100_rf_kill(struct work_struct *work)
5982 {
5983 struct ipw2100_priv *priv =
5984 container_of(work, struct ipw2100_priv, rf_kill.work);
5985 unsigned long flags;
5986
5987 spin_lock_irqsave(&priv->low_lock, flags);
5988
5989 if (rf_kill_active(priv)) {
5990 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
5991 if (!priv->stop_rf_kill)
5992 schedule_delayed_work(&priv->rf_kill,
5993 round_jiffies_relative(HZ));
5994 goto exit_unlock;
5995 }
5996
5997
5998
5999 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6000 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
6001 "device\n");
6002 schedule_reset(priv);
6003 } else
6004 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
6005 "enabled\n");
6006
6007 exit_unlock:
6008 spin_unlock_irqrestore(&priv->low_lock, flags);
6009 }
6010
6011 static void ipw2100_irq_tasklet(unsigned long data);
6012
6013 static const struct net_device_ops ipw2100_netdev_ops = {
6014 .ndo_open = ipw2100_open,
6015 .ndo_stop = ipw2100_close,
6016 .ndo_start_xmit = libipw_xmit,
6017 .ndo_tx_timeout = ipw2100_tx_timeout,
6018 .ndo_set_mac_address = ipw2100_set_address,
6019 .ndo_validate_addr = eth_validate_addr,
6020 };
6021
6022
6023
6024 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6025 void __iomem * ioaddr)
6026 {
6027 struct ipw2100_priv *priv;
6028 struct net_device *dev;
6029
6030 dev = alloc_libipw(sizeof(struct ipw2100_priv), 0);
6031 if (!dev)
6032 return NULL;
6033 priv = libipw_priv(dev);
6034 priv->ieee = netdev_priv(dev);
6035 priv->pci_dev = pci_dev;
6036 priv->net_dev = dev;
6037 priv->ioaddr = ioaddr;
6038
6039 priv->ieee->hard_start_xmit = ipw2100_tx;
6040 priv->ieee->set_security = shim__set_security;
6041
6042 priv->ieee->perfect_rssi = -20;
6043 priv->ieee->worst_rssi = -85;
6044
6045 dev->netdev_ops = &ipw2100_netdev_ops;
6046 dev->ethtool_ops = &ipw2100_ethtool_ops;
6047 dev->wireless_handlers = &ipw2100_wx_handler_def;
6048 priv->wireless_data.libipw = priv->ieee;
6049 dev->wireless_data = &priv->wireless_data;
6050 dev->watchdog_timeo = 3 * HZ;
6051 dev->irq = 0;
6052 dev->min_mtu = 68;
6053 dev->max_mtu = LIBIPW_DATA_LEN;
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065 priv->power_mode = IPW_POWER_AUTO;
6066
6067 #ifdef CONFIG_IPW2100_MONITOR
6068 priv->config |= CFG_CRC_CHECK;
6069 #endif
6070 priv->ieee->wpa_enabled = 0;
6071 priv->ieee->drop_unencrypted = 0;
6072 priv->ieee->privacy_invoked = 0;
6073 priv->ieee->ieee802_1x = 1;
6074
6075
6076 switch (network_mode) {
6077 case 1:
6078 priv->ieee->iw_mode = IW_MODE_ADHOC;
6079 break;
6080 #ifdef CONFIG_IPW2100_MONITOR
6081 case 2:
6082 priv->ieee->iw_mode = IW_MODE_MONITOR;
6083 break;
6084 #endif
6085 default:
6086 case 0:
6087 priv->ieee->iw_mode = IW_MODE_INFRA;
6088 break;
6089 }
6090
6091 if (disable == 1)
6092 priv->status |= STATUS_RF_KILL_SW;
6093
6094 if (channel != 0 &&
6095 ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
6096 priv->config |= CFG_STATIC_CHANNEL;
6097 priv->channel = channel;
6098 }
6099
6100 if (associate)
6101 priv->config |= CFG_ASSOCIATE;
6102
6103 priv->beacon_interval = DEFAULT_BEACON_INTERVAL;
6104 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
6105 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
6106 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED;
6107 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED;
6108 priv->tx_power = IPW_TX_POWER_DEFAULT;
6109 priv->tx_rates = DEFAULT_TX_RATES;
6110
6111 strcpy(priv->nick, "ipw2100");
6112
6113 spin_lock_init(&priv->low_lock);
6114 mutex_init(&priv->action_mutex);
6115 mutex_init(&priv->adapter_mutex);
6116
6117 init_waitqueue_head(&priv->wait_command_queue);
6118
6119 netif_carrier_off(dev);
6120
6121 INIT_LIST_HEAD(&priv->msg_free_list);
6122 INIT_LIST_HEAD(&priv->msg_pend_list);
6123 INIT_STAT(&priv->msg_free_stat);
6124 INIT_STAT(&priv->msg_pend_stat);
6125
6126 INIT_LIST_HEAD(&priv->tx_free_list);
6127 INIT_LIST_HEAD(&priv->tx_pend_list);
6128 INIT_STAT(&priv->tx_free_stat);
6129 INIT_STAT(&priv->tx_pend_stat);
6130
6131 INIT_LIST_HEAD(&priv->fw_pend_list);
6132 INIT_STAT(&priv->fw_pend_stat);
6133
6134 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter);
6135 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work);
6136 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
6137 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
6138 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
6139 INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event);
6140
6141 tasklet_init(&priv->irq_tasklet,
6142 ipw2100_irq_tasklet, (unsigned long)priv);
6143
6144
6145 priv->stop_rf_kill = 1;
6146 priv->stop_hang_check = 1;
6147
6148 return dev;
6149 }
6150
6151 static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6152 const struct pci_device_id *ent)
6153 {
6154 void __iomem *ioaddr;
6155 struct net_device *dev = NULL;
6156 struct ipw2100_priv *priv = NULL;
6157 int err = 0;
6158 int registered = 0;
6159 u32 val;
6160
6161 IPW_DEBUG_INFO("enter\n");
6162
6163 if (!(pci_resource_flags(pci_dev, 0) & IORESOURCE_MEM)) {
6164 IPW_DEBUG_INFO("weird - resource type is not memory\n");
6165 err = -ENODEV;
6166 goto out;
6167 }
6168
6169 ioaddr = pci_iomap(pci_dev, 0, 0);
6170 if (!ioaddr) {
6171 printk(KERN_WARNING DRV_NAME
6172 "Error calling ioremap_nocache.\n");
6173 err = -EIO;
6174 goto fail;
6175 }
6176
6177
6178 dev = ipw2100_alloc_device(pci_dev, ioaddr);
6179 if (!dev) {
6180 printk(KERN_WARNING DRV_NAME
6181 "Error calling ipw2100_alloc_device.\n");
6182 err = -ENOMEM;
6183 goto fail;
6184 }
6185
6186
6187 err = pci_enable_device(pci_dev);
6188 if (err) {
6189 printk(KERN_WARNING DRV_NAME
6190 "Error calling pci_enable_device.\n");
6191 return err;
6192 }
6193
6194 priv = libipw_priv(dev);
6195
6196 pci_set_master(pci_dev);
6197 pci_set_drvdata(pci_dev, priv);
6198
6199 err = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
6200 if (err) {
6201 printk(KERN_WARNING DRV_NAME
6202 "Error calling pci_set_dma_mask.\n");
6203 pci_disable_device(pci_dev);
6204 return err;
6205 }
6206
6207 err = pci_request_regions(pci_dev, DRV_NAME);
6208 if (err) {
6209 printk(KERN_WARNING DRV_NAME
6210 "Error calling pci_request_regions.\n");
6211 pci_disable_device(pci_dev);
6212 return err;
6213 }
6214
6215
6216
6217 pci_read_config_dword(pci_dev, 0x40, &val);
6218 if ((val & 0x0000ff00) != 0)
6219 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6220
6221 if (!ipw2100_hw_is_adapter_in_system(dev)) {
6222 printk(KERN_WARNING DRV_NAME
6223 "Device not found via register read.\n");
6224 err = -ENODEV;
6225 goto fail;
6226 }
6227
6228 SET_NETDEV_DEV(dev, &pci_dev->dev);
6229
6230
6231 priv->status |= STATUS_INT_ENABLED;
6232 ipw2100_disable_interrupts(priv);
6233
6234
6235 if (ipw2100_queues_allocate(priv)) {
6236 printk(KERN_WARNING DRV_NAME
6237 "Error calling ipw2100_queues_allocate.\n");
6238 err = -ENOMEM;
6239 goto fail;
6240 }
6241 ipw2100_queues_initialize(priv);
6242
6243 err = request_irq(pci_dev->irq,
6244 ipw2100_interrupt, IRQF_SHARED, dev->name, priv);
6245 if (err) {
6246 printk(KERN_WARNING DRV_NAME
6247 "Error calling request_irq: %d.\n", pci_dev->irq);
6248 goto fail;
6249 }
6250 dev->irq = pci_dev->irq;
6251
6252 IPW_DEBUG_INFO("Attempting to register device...\n");
6253
6254 printk(KERN_INFO DRV_NAME
6255 ": Detected Intel PRO/Wireless 2100 Network Connection\n");
6256
6257 err = ipw2100_up(priv, 1);
6258 if (err)
6259 goto fail;
6260
6261 err = ipw2100_wdev_init(dev);
6262 if (err)
6263 goto fail;
6264 registered = 1;
6265
6266
6267
6268
6269
6270
6271 err = register_netdev(dev);
6272 if (err) {
6273 printk(KERN_WARNING DRV_NAME
6274 "Error calling register_netdev.\n");
6275 goto fail;
6276 }
6277 registered = 2;
6278
6279 mutex_lock(&priv->action_mutex);
6280
6281 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
6282
6283
6284 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6285 if (err)
6286 goto fail_unlock;
6287
6288
6289
6290 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6291
6292 if (ipw2100_enable_adapter(priv)) {
6293 printk(KERN_WARNING DRV_NAME
6294 ": %s: failed in call to enable adapter.\n",
6295 priv->net_dev->name);
6296 ipw2100_hw_stop_adapter(priv);
6297 err = -EIO;
6298 goto fail_unlock;
6299 }
6300
6301
6302 ipw2100_set_scan_options(priv);
6303 ipw2100_start_scan(priv);
6304 }
6305
6306 IPW_DEBUG_INFO("exit\n");
6307
6308 priv->status |= STATUS_INITIALIZED;
6309
6310 mutex_unlock(&priv->action_mutex);
6311 out:
6312 return err;
6313
6314 fail_unlock:
6315 mutex_unlock(&priv->action_mutex);
6316 fail:
6317 if (dev) {
6318 if (registered >= 2)
6319 unregister_netdev(dev);
6320
6321 if (registered) {
6322 wiphy_unregister(priv->ieee->wdev.wiphy);
6323 kfree(priv->ieee->bg_band.channels);
6324 }
6325
6326 ipw2100_hw_stop_adapter(priv);
6327
6328 ipw2100_disable_interrupts(priv);
6329
6330 if (dev->irq)
6331 free_irq(dev->irq, priv);
6332
6333 ipw2100_kill_works(priv);
6334
6335
6336 ipw2100_queues_free(priv);
6337 sysfs_remove_group(&pci_dev->dev.kobj,
6338 &ipw2100_attribute_group);
6339
6340 free_libipw(dev, 0);
6341 }
6342
6343 pci_iounmap(pci_dev, ioaddr);
6344
6345 pci_release_regions(pci_dev);
6346 pci_disable_device(pci_dev);
6347 goto out;
6348 }
6349
6350 static void ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6351 {
6352 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6353 struct net_device *dev = priv->net_dev;
6354
6355 mutex_lock(&priv->action_mutex);
6356
6357 priv->status &= ~STATUS_INITIALIZED;
6358
6359 sysfs_remove_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6360
6361 #ifdef CONFIG_PM
6362 if (ipw2100_firmware.version)
6363 ipw2100_release_firmware(priv, &ipw2100_firmware);
6364 #endif
6365
6366 ipw2100_down(priv);
6367
6368
6369
6370 mutex_unlock(&priv->action_mutex);
6371
6372
6373
6374
6375
6376 unregister_netdev(dev);
6377
6378 ipw2100_kill_works(priv);
6379
6380 ipw2100_queues_free(priv);
6381
6382
6383 ipw2100_snapshot_free(priv);
6384
6385 free_irq(dev->irq, priv);
6386
6387 pci_iounmap(pci_dev, priv->ioaddr);
6388
6389
6390 wiphy_unregister(priv->ieee->wdev.wiphy);
6391 kfree(priv->ieee->bg_band.channels);
6392 free_libipw(dev, 0);
6393
6394 pci_release_regions(pci_dev);
6395 pci_disable_device(pci_dev);
6396
6397 IPW_DEBUG_INFO("exit\n");
6398 }
6399
6400 #ifdef CONFIG_PM
6401 static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6402 {
6403 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6404 struct net_device *dev = priv->net_dev;
6405
6406 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6407
6408 mutex_lock(&priv->action_mutex);
6409 if (priv->status & STATUS_INITIALIZED) {
6410
6411 ipw2100_down(priv);
6412 }
6413
6414
6415 netif_device_detach(dev);
6416
6417 pci_save_state(pci_dev);
6418 pci_disable_device(pci_dev);
6419 pci_set_power_state(pci_dev, PCI_D3hot);
6420
6421 priv->suspend_at = ktime_get_boottime_seconds();
6422
6423 mutex_unlock(&priv->action_mutex);
6424
6425 return 0;
6426 }
6427
6428 static int ipw2100_resume(struct pci_dev *pci_dev)
6429 {
6430 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6431 struct net_device *dev = priv->net_dev;
6432 int err;
6433 u32 val;
6434
6435 if (IPW2100_PM_DISABLED)
6436 return 0;
6437
6438 mutex_lock(&priv->action_mutex);
6439
6440 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6441
6442 pci_set_power_state(pci_dev, PCI_D0);
6443 err = pci_enable_device(pci_dev);
6444 if (err) {
6445 printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
6446 dev->name);
6447 mutex_unlock(&priv->action_mutex);
6448 return err;
6449 }
6450 pci_restore_state(pci_dev);
6451
6452
6453
6454
6455
6456
6457
6458 pci_read_config_dword(pci_dev, 0x40, &val);
6459 if ((val & 0x0000ff00) != 0)
6460 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6461
6462
6463
6464 netif_device_attach(dev);
6465
6466 priv->suspend_time = ktime_get_boottime_seconds() - priv->suspend_at;
6467
6468
6469 if (!(priv->status & STATUS_RF_KILL_SW))
6470 ipw2100_up(priv, 0);
6471
6472 mutex_unlock(&priv->action_mutex);
6473
6474 return 0;
6475 }
6476 #endif
6477
6478 static void ipw2100_shutdown(struct pci_dev *pci_dev)
6479 {
6480 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6481
6482
6483 ipw2100_down(priv);
6484
6485 pci_disable_device(pci_dev);
6486 }
6487
6488 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6489
6490 static const struct pci_device_id ipw2100_pci_id_table[] = {
6491 IPW2100_DEV_ID(0x2520),
6492 IPW2100_DEV_ID(0x2521),
6493 IPW2100_DEV_ID(0x2524),
6494 IPW2100_DEV_ID(0x2525),
6495 IPW2100_DEV_ID(0x2526),
6496 IPW2100_DEV_ID(0x2522),
6497 IPW2100_DEV_ID(0x2523),
6498 IPW2100_DEV_ID(0x2527),
6499 IPW2100_DEV_ID(0x2528),
6500 IPW2100_DEV_ID(0x2529),
6501 IPW2100_DEV_ID(0x252B),
6502 IPW2100_DEV_ID(0x252C),
6503 IPW2100_DEV_ID(0x252D),
6504
6505 IPW2100_DEV_ID(0x2550),
6506 IPW2100_DEV_ID(0x2551),
6507 IPW2100_DEV_ID(0x2553),
6508 IPW2100_DEV_ID(0x2554),
6509 IPW2100_DEV_ID(0x2555),
6510
6511 IPW2100_DEV_ID(0x2560),
6512 IPW2100_DEV_ID(0x2562),
6513 IPW2100_DEV_ID(0x2563),
6514 IPW2100_DEV_ID(0x2561),
6515 IPW2100_DEV_ID(0x2565),
6516 IPW2100_DEV_ID(0x2566),
6517 IPW2100_DEV_ID(0x2567),
6518
6519 IPW2100_DEV_ID(0x2570),
6520
6521 IPW2100_DEV_ID(0x2580),
6522 IPW2100_DEV_ID(0x2582),
6523 IPW2100_DEV_ID(0x2583),
6524 IPW2100_DEV_ID(0x2581),
6525 IPW2100_DEV_ID(0x2585),
6526 IPW2100_DEV_ID(0x2586),
6527 IPW2100_DEV_ID(0x2587),
6528
6529 IPW2100_DEV_ID(0x2590),
6530 IPW2100_DEV_ID(0x2592),
6531 IPW2100_DEV_ID(0x2591),
6532 IPW2100_DEV_ID(0x2593),
6533 IPW2100_DEV_ID(0x2596),
6534 IPW2100_DEV_ID(0x2598),
6535
6536 IPW2100_DEV_ID(0x25A0),
6537 {0,},
6538 };
6539
6540 MODULE_DEVICE_TABLE(pci, ipw2100_pci_id_table);
6541
6542 static struct pci_driver ipw2100_pci_driver = {
6543 .name = DRV_NAME,
6544 .id_table = ipw2100_pci_id_table,
6545 .probe = ipw2100_pci_init_one,
6546 .remove = ipw2100_pci_remove_one,
6547 #ifdef CONFIG_PM
6548 .suspend = ipw2100_suspend,
6549 .resume = ipw2100_resume,
6550 #endif
6551 .shutdown = ipw2100_shutdown,
6552 };
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563 static int __init ipw2100_init(void)
6564 {
6565 int ret;
6566
6567 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6568 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6569
6570 pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
6571 PM_QOS_DEFAULT_VALUE);
6572
6573 ret = pci_register_driver(&ipw2100_pci_driver);
6574 if (ret)
6575 goto out;
6576
6577 #ifdef CONFIG_IPW2100_DEBUG
6578 ipw2100_debug_level = debug;
6579 ret = driver_create_file(&ipw2100_pci_driver.driver,
6580 &driver_attr_debug_level);
6581 #endif
6582
6583 out:
6584 return ret;
6585 }
6586
6587
6588
6589
6590 static void __exit ipw2100_exit(void)
6591 {
6592
6593 #ifdef CONFIG_IPW2100_DEBUG
6594 driver_remove_file(&ipw2100_pci_driver.driver,
6595 &driver_attr_debug_level);
6596 #endif
6597 pci_unregister_driver(&ipw2100_pci_driver);
6598 pm_qos_remove_request(&ipw2100_pm_qos_req);
6599 }
6600
6601 module_init(ipw2100_init);
6602 module_exit(ipw2100_exit);
6603
6604 static int ipw2100_wx_get_name(struct net_device *dev,
6605 struct iw_request_info *info,
6606 union iwreq_data *wrqu, char *extra)
6607 {
6608
6609
6610
6611
6612 struct ipw2100_priv *priv = libipw_priv(dev);
6613 if (!(priv->status & STATUS_ASSOCIATED))
6614 strcpy(wrqu->name, "unassociated");
6615 else
6616 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
6617
6618 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
6619 return 0;
6620 }
6621
6622 static int ipw2100_wx_set_freq(struct net_device *dev,
6623 struct iw_request_info *info,
6624 union iwreq_data *wrqu, char *extra)
6625 {
6626 struct ipw2100_priv *priv = libipw_priv(dev);
6627 struct iw_freq *fwrq = &wrqu->freq;
6628 int err = 0;
6629
6630 if (priv->ieee->iw_mode == IW_MODE_INFRA)
6631 return -EOPNOTSUPP;
6632
6633 mutex_lock(&priv->action_mutex);
6634 if (!(priv->status & STATUS_INITIALIZED)) {
6635 err = -EIO;
6636 goto done;
6637 }
6638
6639
6640 if (fwrq->e == 1) {
6641 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6642 int f = fwrq->m / 100000;
6643 int c = 0;
6644
6645 while ((c < REG_MAX_CHANNEL) &&
6646 (f != ipw2100_frequencies[c]))
6647 c++;
6648
6649
6650 fwrq->e = 0;
6651 fwrq->m = c + 1;
6652 }
6653 }
6654
6655 if (fwrq->e > 0 || fwrq->m > 1000) {
6656 err = -EOPNOTSUPP;
6657 goto done;
6658 } else {
6659 IPW_DEBUG_WX("SET Freq/Channel -> %d\n", fwrq->m);
6660 err = ipw2100_set_channel(priv, fwrq->m, 0);
6661 }
6662
6663 done:
6664 mutex_unlock(&priv->action_mutex);
6665 return err;
6666 }
6667
6668 static int ipw2100_wx_get_freq(struct net_device *dev,
6669 struct iw_request_info *info,
6670 union iwreq_data *wrqu, char *extra)
6671 {
6672
6673
6674
6675
6676 struct ipw2100_priv *priv = libipw_priv(dev);
6677
6678 wrqu->freq.e = 0;
6679
6680
6681
6682 if (priv->config & CFG_STATIC_CHANNEL ||
6683 priv->status & STATUS_ASSOCIATED)
6684 wrqu->freq.m = priv->channel;
6685 else
6686 wrqu->freq.m = 0;
6687
6688 IPW_DEBUG_WX("GET Freq/Channel -> %d\n", priv->channel);
6689 return 0;
6690
6691 }
6692
6693 static int ipw2100_wx_set_mode(struct net_device *dev,
6694 struct iw_request_info *info,
6695 union iwreq_data *wrqu, char *extra)
6696 {
6697 struct ipw2100_priv *priv = libipw_priv(dev);
6698 int err = 0;
6699
6700 IPW_DEBUG_WX("SET Mode -> %d\n", wrqu->mode);
6701
6702 if (wrqu->mode == priv->ieee->iw_mode)
6703 return 0;
6704
6705 mutex_lock(&priv->action_mutex);
6706 if (!(priv->status & STATUS_INITIALIZED)) {
6707 err = -EIO;
6708 goto done;
6709 }
6710
6711 switch (wrqu->mode) {
6712 #ifdef CONFIG_IPW2100_MONITOR
6713 case IW_MODE_MONITOR:
6714 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
6715 break;
6716 #endif
6717 case IW_MODE_ADHOC:
6718 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
6719 break;
6720 case IW_MODE_INFRA:
6721 case IW_MODE_AUTO:
6722 default:
6723 err = ipw2100_switch_mode(priv, IW_MODE_INFRA);
6724 break;
6725 }
6726
6727 done:
6728 mutex_unlock(&priv->action_mutex);
6729 return err;
6730 }
6731
6732 static int ipw2100_wx_get_mode(struct net_device *dev,
6733 struct iw_request_info *info,
6734 union iwreq_data *wrqu, char *extra)
6735 {
6736
6737
6738
6739
6740 struct ipw2100_priv *priv = libipw_priv(dev);
6741
6742 wrqu->mode = priv->ieee->iw_mode;
6743 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
6744
6745 return 0;
6746 }
6747
6748 #define POWER_MODES 5
6749
6750
6751 static const s32 timeout_duration[POWER_MODES] = {
6752 350000,
6753 250000,
6754 75000,
6755 37000,
6756 25000,
6757 };
6758
6759 static const s32 period_duration[POWER_MODES] = {
6760 400000,
6761 700000,
6762 1000000,
6763 1000000,
6764 1000000
6765 };
6766
6767 static int ipw2100_wx_get_range(struct net_device *dev,
6768 struct iw_request_info *info,
6769 union iwreq_data *wrqu, char *extra)
6770 {
6771
6772
6773
6774
6775 struct ipw2100_priv *priv = libipw_priv(dev);
6776 struct iw_range *range = (struct iw_range *)extra;
6777 u16 val;
6778 int i, level;
6779
6780 wrqu->data.length = sizeof(*range);
6781 memset(range, 0, sizeof(*range));
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792 range->throughput = 5 * 1000 * 1000;
6793
6794
6795
6796 range->max_qual.qual = 100;
6797
6798 range->max_qual.level = 0;
6799 range->max_qual.noise = 0;
6800 range->max_qual.updated = 7;
6801
6802 range->avg_qual.qual = 70;
6803
6804 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6805 range->avg_qual.noise = 0;
6806 range->avg_qual.updated = 7;
6807
6808 range->num_bitrates = RATE_COUNT;
6809
6810 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
6811 range->bitrate[i] = ipw2100_bg_rates[i].bitrate * 100 * 1000;
6812 }
6813
6814 range->min_rts = MIN_RTS_THRESHOLD;
6815 range->max_rts = MAX_RTS_THRESHOLD;
6816 range->min_frag = MIN_FRAG_THRESHOLD;
6817 range->max_frag = MAX_FRAG_THRESHOLD;
6818
6819 range->min_pmp = period_duration[0];
6820 range->max_pmp = period_duration[POWER_MODES - 1];
6821 range->min_pmt = timeout_duration[POWER_MODES - 1];
6822 range->max_pmt = timeout_duration[0];
6823
6824
6825 range->pmp_flags = IW_POWER_PERIOD;
6826
6827 range->pmt_flags = IW_POWER_TIMEOUT;
6828
6829 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6830
6831 range->encoding_size[0] = 5;
6832 range->encoding_size[1] = 13;
6833 range->num_encoding_sizes = 2;
6834 range->max_encoding_tokens = WEP_KEYS;
6835
6836
6837 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6838 range->txpower_capa = IW_TXPOW_DBM;
6839 range->num_txpower = IW_MAX_TXPOWER;
6840 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
6841 i < IW_MAX_TXPOWER;
6842 i++, level -=
6843 ((IPW_TX_POWER_MAX_DBM -
6844 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
6845 range->txpower[i] = level / 16;
6846 } else {
6847 range->txpower_capa = 0;
6848 range->num_txpower = 0;
6849 }
6850
6851
6852 range->we_version_compiled = WIRELESS_EXT;
6853 range->we_version_source = 18;
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863 range->num_channels = FREQ_COUNT;
6864
6865 val = 0;
6866 for (i = 0; i < FREQ_COUNT; i++) {
6867
6868
6869 range->freq[val].i = i + 1;
6870 range->freq[val].m = ipw2100_frequencies[i] * 100000;
6871 range->freq[val].e = 1;
6872 val++;
6873
6874 if (val == IW_MAX_FREQUENCIES)
6875 break;
6876 }
6877 range->num_frequency = val;
6878
6879
6880 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6881 IW_EVENT_CAPA_MASK(SIOCGIWAP));
6882 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6883
6884 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6885 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6886
6887 IPW_DEBUG_WX("GET Range\n");
6888
6889 return 0;
6890 }
6891
6892 static int ipw2100_wx_set_wap(struct net_device *dev,
6893 struct iw_request_info *info,
6894 union iwreq_data *wrqu, char *extra)
6895 {
6896 struct ipw2100_priv *priv = libipw_priv(dev);
6897 int err = 0;
6898
6899
6900 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6901 return -EINVAL;
6902
6903 mutex_lock(&priv->action_mutex);
6904 if (!(priv->status & STATUS_INITIALIZED)) {
6905 err = -EIO;
6906 goto done;
6907 }
6908
6909 if (is_broadcast_ether_addr(wrqu->ap_addr.sa_data) ||
6910 is_zero_ether_addr(wrqu->ap_addr.sa_data)) {
6911
6912 IPW_DEBUG_WX("exit - disable mandatory BSSID\n");
6913 priv->config &= ~CFG_STATIC_BSSID;
6914 err = ipw2100_set_mandatory_bssid(priv, NULL, 0);
6915 goto done;
6916 }
6917
6918 priv->config |= CFG_STATIC_BSSID;
6919 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN);
6920
6921 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0);
6922
6923 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data);
6924
6925 done:
6926 mutex_unlock(&priv->action_mutex);
6927 return err;
6928 }
6929
6930 static int ipw2100_wx_get_wap(struct net_device *dev,
6931 struct iw_request_info *info,
6932 union iwreq_data *wrqu, char *extra)
6933 {
6934
6935
6936
6937
6938 struct ipw2100_priv *priv = libipw_priv(dev);
6939
6940
6941
6942 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
6943 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6944 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6945 } else
6946 eth_zero_addr(wrqu->ap_addr.sa_data);
6947
6948 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data);
6949 return 0;
6950 }
6951
6952 static int ipw2100_wx_set_essid(struct net_device *dev,
6953 struct iw_request_info *info,
6954 union iwreq_data *wrqu, char *extra)
6955 {
6956 struct ipw2100_priv *priv = libipw_priv(dev);
6957 char *essid = "";
6958 int length = 0;
6959 int err = 0;
6960
6961 mutex_lock(&priv->action_mutex);
6962 if (!(priv->status & STATUS_INITIALIZED)) {
6963 err = -EIO;
6964 goto done;
6965 }
6966
6967 if (wrqu->essid.flags && wrqu->essid.length) {
6968 length = wrqu->essid.length;
6969 essid = extra;
6970 }
6971
6972 if (length == 0) {
6973 IPW_DEBUG_WX("Setting ESSID to ANY\n");
6974 priv->config &= ~CFG_STATIC_ESSID;
6975 err = ipw2100_set_essid(priv, NULL, 0, 0);
6976 goto done;
6977 }
6978
6979 length = min(length, IW_ESSID_MAX_SIZE);
6980
6981 priv->config |= CFG_STATIC_ESSID;
6982
6983 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
6984 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
6985 err = 0;
6986 goto done;
6987 }
6988
6989 IPW_DEBUG_WX("Setting ESSID: '%*pE' (%d)\n", length, essid, length);
6990
6991 priv->essid_len = length;
6992 memcpy(priv->essid, essid, priv->essid_len);
6993
6994 err = ipw2100_set_essid(priv, essid, length, 0);
6995
6996 done:
6997 mutex_unlock(&priv->action_mutex);
6998 return err;
6999 }
7000
7001 static int ipw2100_wx_get_essid(struct net_device *dev,
7002 struct iw_request_info *info,
7003 union iwreq_data *wrqu, char *extra)
7004 {
7005
7006
7007
7008
7009 struct ipw2100_priv *priv = libipw_priv(dev);
7010
7011
7012
7013 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
7014 IPW_DEBUG_WX("Getting essid: '%*pE'\n",
7015 priv->essid_len, priv->essid);
7016 memcpy(extra, priv->essid, priv->essid_len);
7017 wrqu->essid.length = priv->essid_len;
7018 wrqu->essid.flags = 1;
7019 } else {
7020 IPW_DEBUG_WX("Getting essid: ANY\n");
7021 wrqu->essid.length = 0;
7022 wrqu->essid.flags = 0;
7023 }
7024
7025 return 0;
7026 }
7027
7028 static int ipw2100_wx_set_nick(struct net_device *dev,
7029 struct iw_request_info *info,
7030 union iwreq_data *wrqu, char *extra)
7031 {
7032
7033
7034
7035
7036 struct ipw2100_priv *priv = libipw_priv(dev);
7037
7038 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
7039 return -E2BIG;
7040
7041 wrqu->data.length = min_t(size_t, wrqu->data.length, sizeof(priv->nick));
7042 memset(priv->nick, 0, sizeof(priv->nick));
7043 memcpy(priv->nick, extra, wrqu->data.length);
7044
7045 IPW_DEBUG_WX("SET Nickname -> %s\n", priv->nick);
7046
7047 return 0;
7048 }
7049
7050 static int ipw2100_wx_get_nick(struct net_device *dev,
7051 struct iw_request_info *info,
7052 union iwreq_data *wrqu, char *extra)
7053 {
7054
7055
7056
7057
7058 struct ipw2100_priv *priv = libipw_priv(dev);
7059
7060 wrqu->data.length = strlen(priv->nick);
7061 memcpy(extra, priv->nick, wrqu->data.length);
7062 wrqu->data.flags = 1;
7063
7064 IPW_DEBUG_WX("GET Nickname -> %s\n", extra);
7065
7066 return 0;
7067 }
7068
7069 static int ipw2100_wx_set_rate(struct net_device *dev,
7070 struct iw_request_info *info,
7071 union iwreq_data *wrqu, char *extra)
7072 {
7073 struct ipw2100_priv *priv = libipw_priv(dev);
7074 u32 target_rate = wrqu->bitrate.value;
7075 u32 rate;
7076 int err = 0;
7077
7078 mutex_lock(&priv->action_mutex);
7079 if (!(priv->status & STATUS_INITIALIZED)) {
7080 err = -EIO;
7081 goto done;
7082 }
7083
7084 rate = 0;
7085
7086 if (target_rate == 1000000 ||
7087 (!wrqu->bitrate.fixed && target_rate > 1000000))
7088 rate |= TX_RATE_1_MBIT;
7089 if (target_rate == 2000000 ||
7090 (!wrqu->bitrate.fixed && target_rate > 2000000))
7091 rate |= TX_RATE_2_MBIT;
7092 if (target_rate == 5500000 ||
7093 (!wrqu->bitrate.fixed && target_rate > 5500000))
7094 rate |= TX_RATE_5_5_MBIT;
7095 if (target_rate == 11000000 ||
7096 (!wrqu->bitrate.fixed && target_rate > 11000000))
7097 rate |= TX_RATE_11_MBIT;
7098 if (rate == 0)
7099 rate = DEFAULT_TX_RATES;
7100
7101 err = ipw2100_set_tx_rates(priv, rate, 0);
7102
7103 IPW_DEBUG_WX("SET Rate -> %04X\n", rate);
7104 done:
7105 mutex_unlock(&priv->action_mutex);
7106 return err;
7107 }
7108
7109 static int ipw2100_wx_get_rate(struct net_device *dev,
7110 struct iw_request_info *info,
7111 union iwreq_data *wrqu, char *extra)
7112 {
7113 struct ipw2100_priv *priv = libipw_priv(dev);
7114 int val;
7115 unsigned int len = sizeof(val);
7116 int err = 0;
7117
7118 if (!(priv->status & STATUS_ENABLED) ||
7119 priv->status & STATUS_RF_KILL_MASK ||
7120 !(priv->status & STATUS_ASSOCIATED)) {
7121 wrqu->bitrate.value = 0;
7122 return 0;
7123 }
7124
7125 mutex_lock(&priv->action_mutex);
7126 if (!(priv->status & STATUS_INITIALIZED)) {
7127 err = -EIO;
7128 goto done;
7129 }
7130
7131 err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len);
7132 if (err) {
7133 IPW_DEBUG_WX("failed querying ordinals.\n");
7134 goto done;
7135 }
7136
7137 switch (val & TX_RATE_MASK) {
7138 case TX_RATE_1_MBIT:
7139 wrqu->bitrate.value = 1000000;
7140 break;
7141 case TX_RATE_2_MBIT:
7142 wrqu->bitrate.value = 2000000;
7143 break;
7144 case TX_RATE_5_5_MBIT:
7145 wrqu->bitrate.value = 5500000;
7146 break;
7147 case TX_RATE_11_MBIT:
7148 wrqu->bitrate.value = 11000000;
7149 break;
7150 default:
7151 wrqu->bitrate.value = 0;
7152 }
7153
7154 IPW_DEBUG_WX("GET Rate -> %d\n", wrqu->bitrate.value);
7155
7156 done:
7157 mutex_unlock(&priv->action_mutex);
7158 return err;
7159 }
7160
7161 static int ipw2100_wx_set_rts(struct net_device *dev,
7162 struct iw_request_info *info,
7163 union iwreq_data *wrqu, char *extra)
7164 {
7165 struct ipw2100_priv *priv = libipw_priv(dev);
7166 int value, err;
7167
7168
7169 if (wrqu->rts.fixed == 0)
7170 return -EINVAL;
7171
7172 mutex_lock(&priv->action_mutex);
7173 if (!(priv->status & STATUS_INITIALIZED)) {
7174 err = -EIO;
7175 goto done;
7176 }
7177
7178 if (wrqu->rts.disabled)
7179 value = priv->rts_threshold | RTS_DISABLED;
7180 else {
7181 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7182 err = -EINVAL;
7183 goto done;
7184 }
7185 value = wrqu->rts.value;
7186 }
7187
7188 err = ipw2100_set_rts_threshold(priv, value);
7189
7190 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X\n", value);
7191 done:
7192 mutex_unlock(&priv->action_mutex);
7193 return err;
7194 }
7195
7196 static int ipw2100_wx_get_rts(struct net_device *dev,
7197 struct iw_request_info *info,
7198 union iwreq_data *wrqu, char *extra)
7199 {
7200
7201
7202
7203
7204 struct ipw2100_priv *priv = libipw_priv(dev);
7205
7206 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7207 wrqu->rts.fixed = 1;
7208
7209
7210 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
7211
7212 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X\n", wrqu->rts.value);
7213
7214 return 0;
7215 }
7216
7217 static int ipw2100_wx_set_txpow(struct net_device *dev,
7218 struct iw_request_info *info,
7219 union iwreq_data *wrqu, char *extra)
7220 {
7221 struct ipw2100_priv *priv = libipw_priv(dev);
7222 int err = 0, value;
7223
7224 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7225 return -EINPROGRESS;
7226
7227 if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7228 return 0;
7229
7230 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7231 return -EINVAL;
7232
7233 if (wrqu->txpower.fixed == 0)
7234 value = IPW_TX_POWER_DEFAULT;
7235 else {
7236 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
7237 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7238 return -EINVAL;
7239
7240 value = wrqu->txpower.value;
7241 }
7242
7243 mutex_lock(&priv->action_mutex);
7244 if (!(priv->status & STATUS_INITIALIZED)) {
7245 err = -EIO;
7246 goto done;
7247 }
7248
7249 err = ipw2100_set_tx_power(priv, value);
7250
7251 IPW_DEBUG_WX("SET TX Power -> %d\n", value);
7252
7253 done:
7254 mutex_unlock(&priv->action_mutex);
7255 return err;
7256 }
7257
7258 static int ipw2100_wx_get_txpow(struct net_device *dev,
7259 struct iw_request_info *info,
7260 union iwreq_data *wrqu, char *extra)
7261 {
7262
7263
7264
7265
7266 struct ipw2100_priv *priv = libipw_priv(dev);
7267
7268 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7269
7270 if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7271 wrqu->txpower.fixed = 0;
7272 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7273 } else {
7274 wrqu->txpower.fixed = 1;
7275 wrqu->txpower.value = priv->tx_power;
7276 }
7277
7278 wrqu->txpower.flags = IW_TXPOW_DBM;
7279
7280 IPW_DEBUG_WX("GET TX Power -> %d\n", wrqu->txpower.value);
7281
7282 return 0;
7283 }
7284
7285 static int ipw2100_wx_set_frag(struct net_device *dev,
7286 struct iw_request_info *info,
7287 union iwreq_data *wrqu, char *extra)
7288 {
7289
7290
7291
7292
7293 struct ipw2100_priv *priv = libipw_priv(dev);
7294
7295 if (!wrqu->frag.fixed)
7296 return -EINVAL;
7297
7298 if (wrqu->frag.disabled) {
7299 priv->frag_threshold |= FRAG_DISABLED;
7300 priv->ieee->fts = DEFAULT_FTS;
7301 } else {
7302 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
7303 wrqu->frag.value > MAX_FRAG_THRESHOLD)
7304 return -EINVAL;
7305
7306 priv->ieee->fts = wrqu->frag.value & ~0x1;
7307 priv->frag_threshold = priv->ieee->fts;
7308 }
7309
7310 IPW_DEBUG_WX("SET Frag Threshold -> %d\n", priv->ieee->fts);
7311
7312 return 0;
7313 }
7314
7315 static int ipw2100_wx_get_frag(struct net_device *dev,
7316 struct iw_request_info *info,
7317 union iwreq_data *wrqu, char *extra)
7318 {
7319
7320
7321
7322
7323 struct ipw2100_priv *priv = libipw_priv(dev);
7324 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7325 wrqu->frag.fixed = 0;
7326 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
7327
7328 IPW_DEBUG_WX("GET Frag Threshold -> %d\n", wrqu->frag.value);
7329
7330 return 0;
7331 }
7332
7333 static int ipw2100_wx_set_retry(struct net_device *dev,
7334 struct iw_request_info *info,
7335 union iwreq_data *wrqu, char *extra)
7336 {
7337 struct ipw2100_priv *priv = libipw_priv(dev);
7338 int err = 0;
7339
7340 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7341 return -EINVAL;
7342
7343 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7344 return 0;
7345
7346 mutex_lock(&priv->action_mutex);
7347 if (!(priv->status & STATUS_INITIALIZED)) {
7348 err = -EIO;
7349 goto done;
7350 }
7351
7352 if (wrqu->retry.flags & IW_RETRY_SHORT) {
7353 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7354 IPW_DEBUG_WX("SET Short Retry Limit -> %d\n",
7355 wrqu->retry.value);
7356 goto done;
7357 }
7358
7359 if (wrqu->retry.flags & IW_RETRY_LONG) {
7360 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7361 IPW_DEBUG_WX("SET Long Retry Limit -> %d\n",
7362 wrqu->retry.value);
7363 goto done;
7364 }
7365
7366 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7367 if (!err)
7368 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7369
7370 IPW_DEBUG_WX("SET Both Retry Limits -> %d\n", wrqu->retry.value);
7371
7372 done:
7373 mutex_unlock(&priv->action_mutex);
7374 return err;
7375 }
7376
7377 static int ipw2100_wx_get_retry(struct net_device *dev,
7378 struct iw_request_info *info,
7379 union iwreq_data *wrqu, char *extra)
7380 {
7381
7382
7383
7384
7385 struct ipw2100_priv *priv = libipw_priv(dev);
7386
7387 wrqu->retry.disabled = 0;
7388
7389 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7390 return -EINVAL;
7391
7392 if (wrqu->retry.flags & IW_RETRY_LONG) {
7393 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7394 wrqu->retry.value = priv->long_retry_limit;
7395 } else {
7396 wrqu->retry.flags =
7397 (priv->short_retry_limit !=
7398 priv->long_retry_limit) ?
7399 IW_RETRY_LIMIT | IW_RETRY_SHORT : IW_RETRY_LIMIT;
7400
7401 wrqu->retry.value = priv->short_retry_limit;
7402 }
7403
7404 IPW_DEBUG_WX("GET Retry -> %d\n", wrqu->retry.value);
7405
7406 return 0;
7407 }
7408
7409 static int ipw2100_wx_set_scan(struct net_device *dev,
7410 struct iw_request_info *info,
7411 union iwreq_data *wrqu, char *extra)
7412 {
7413 struct ipw2100_priv *priv = libipw_priv(dev);
7414 int err = 0;
7415
7416 mutex_lock(&priv->action_mutex);
7417 if (!(priv->status & STATUS_INITIALIZED)) {
7418 err = -EIO;
7419 goto done;
7420 }
7421
7422 IPW_DEBUG_WX("Initiating scan...\n");
7423
7424 priv->user_requested_scan = 1;
7425 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7426 IPW_DEBUG_WX("Start scan failed.\n");
7427
7428
7429
7430 }
7431
7432 done:
7433 mutex_unlock(&priv->action_mutex);
7434 return err;
7435 }
7436
7437 static int ipw2100_wx_get_scan(struct net_device *dev,
7438 struct iw_request_info *info,
7439 union iwreq_data *wrqu, char *extra)
7440 {
7441
7442
7443
7444
7445 struct ipw2100_priv *priv = libipw_priv(dev);
7446 return libipw_wx_get_scan(priv->ieee, info, wrqu, extra);
7447 }
7448
7449
7450
7451
7452 static int ipw2100_wx_set_encode(struct net_device *dev,
7453 struct iw_request_info *info,
7454 union iwreq_data *wrqu, char *key)
7455 {
7456
7457
7458
7459
7460 struct ipw2100_priv *priv = libipw_priv(dev);
7461 return libipw_wx_set_encode(priv->ieee, info, wrqu, key);
7462 }
7463
7464 static int ipw2100_wx_get_encode(struct net_device *dev,
7465 struct iw_request_info *info,
7466 union iwreq_data *wrqu, char *key)
7467 {
7468
7469
7470
7471
7472 struct ipw2100_priv *priv = libipw_priv(dev);
7473 return libipw_wx_get_encode(priv->ieee, info, wrqu, key);
7474 }
7475
7476 static int ipw2100_wx_set_power(struct net_device *dev,
7477 struct iw_request_info *info,
7478 union iwreq_data *wrqu, char *extra)
7479 {
7480 struct ipw2100_priv *priv = libipw_priv(dev);
7481 int err = 0;
7482
7483 mutex_lock(&priv->action_mutex);
7484 if (!(priv->status & STATUS_INITIALIZED)) {
7485 err = -EIO;
7486 goto done;
7487 }
7488
7489 if (wrqu->power.disabled) {
7490 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
7491 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
7492 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
7493 goto done;
7494 }
7495
7496 switch (wrqu->power.flags & IW_POWER_MODE) {
7497 case IW_POWER_ON:
7498 case IW_POWER_MODE:
7499 case IW_POWER_ALL_R:
7500 break;
7501 default:
7502 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7503 wrqu->power.flags);
7504 err = -EOPNOTSUPP;
7505 goto done;
7506 }
7507
7508
7509
7510 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7511 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7512
7513 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7514
7515 done:
7516 mutex_unlock(&priv->action_mutex);
7517 return err;
7518
7519 }
7520
7521 static int ipw2100_wx_get_power(struct net_device *dev,
7522 struct iw_request_info *info,
7523 union iwreq_data *wrqu, char *extra)
7524 {
7525
7526
7527
7528
7529 struct ipw2100_priv *priv = libipw_priv(dev);
7530
7531 if (!(priv->power_mode & IPW_POWER_ENABLED))
7532 wrqu->power.disabled = 1;
7533 else {
7534 wrqu->power.disabled = 0;
7535 wrqu->power.flags = 0;
7536 }
7537
7538 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
7539
7540 return 0;
7541 }
7542
7543
7544
7545
7546
7547
7548 static int ipw2100_wx_set_genie(struct net_device *dev,
7549 struct iw_request_info *info,
7550 union iwreq_data *wrqu, char *extra)
7551 {
7552
7553 struct ipw2100_priv *priv = libipw_priv(dev);
7554 struct libipw_device *ieee = priv->ieee;
7555 u8 *buf;
7556
7557 if (!ieee->wpa_enabled)
7558 return -EOPNOTSUPP;
7559
7560 if (wrqu->data.length > MAX_WPA_IE_LEN ||
7561 (wrqu->data.length && extra == NULL))
7562 return -EINVAL;
7563
7564 if (wrqu->data.length) {
7565 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL);
7566 if (buf == NULL)
7567 return -ENOMEM;
7568
7569 kfree(ieee->wpa_ie);
7570 ieee->wpa_ie = buf;
7571 ieee->wpa_ie_len = wrqu->data.length;
7572 } else {
7573 kfree(ieee->wpa_ie);
7574 ieee->wpa_ie = NULL;
7575 ieee->wpa_ie_len = 0;
7576 }
7577
7578 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7579
7580 return 0;
7581 }
7582
7583
7584 static int ipw2100_wx_get_genie(struct net_device *dev,
7585 struct iw_request_info *info,
7586 union iwreq_data *wrqu, char *extra)
7587 {
7588 struct ipw2100_priv *priv = libipw_priv(dev);
7589 struct libipw_device *ieee = priv->ieee;
7590
7591 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7592 wrqu->data.length = 0;
7593 return 0;
7594 }
7595
7596 if (wrqu->data.length < ieee->wpa_ie_len)
7597 return -E2BIG;
7598
7599 wrqu->data.length = ieee->wpa_ie_len;
7600 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7601
7602 return 0;
7603 }
7604
7605
7606 static int ipw2100_wx_set_auth(struct net_device *dev,
7607 struct iw_request_info *info,
7608 union iwreq_data *wrqu, char *extra)
7609 {
7610 struct ipw2100_priv *priv = libipw_priv(dev);
7611 struct libipw_device *ieee = priv->ieee;
7612 struct iw_param *param = &wrqu->param;
7613 struct lib80211_crypt_data *crypt;
7614 unsigned long flags;
7615 int ret = 0;
7616
7617 switch (param->flags & IW_AUTH_INDEX) {
7618 case IW_AUTH_WPA_VERSION:
7619 case IW_AUTH_CIPHER_PAIRWISE:
7620 case IW_AUTH_CIPHER_GROUP:
7621 case IW_AUTH_KEY_MGMT:
7622
7623
7624
7625 break;
7626
7627 case IW_AUTH_TKIP_COUNTERMEASURES:
7628 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7629 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7630 break;
7631
7632 flags = crypt->ops->get_flags(crypt->priv);
7633
7634 if (param->value)
7635 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7636 else
7637 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7638
7639 crypt->ops->set_flags(flags, crypt->priv);
7640
7641 break;
7642
7643 case IW_AUTH_DROP_UNENCRYPTED:{
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655 struct libipw_security sec = {
7656 .flags = SEC_ENABLED,
7657 .enabled = param->value,
7658 };
7659 priv->ieee->drop_unencrypted = param->value;
7660
7661
7662
7663 if (!param->value) {
7664 sec.flags |= SEC_LEVEL;
7665 sec.level = SEC_LEVEL_0;
7666 } else {
7667 sec.flags |= SEC_LEVEL;
7668 sec.level = SEC_LEVEL_1;
7669 }
7670 if (priv->ieee->set_security)
7671 priv->ieee->set_security(priv->ieee->dev, &sec);
7672 break;
7673 }
7674
7675 case IW_AUTH_80211_AUTH_ALG:
7676 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7677 break;
7678
7679 case IW_AUTH_WPA_ENABLED:
7680 ret = ipw2100_wpa_enable(priv, param->value);
7681 break;
7682
7683 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7684 ieee->ieee802_1x = param->value;
7685 break;
7686
7687
7688 case IW_AUTH_PRIVACY_INVOKED:
7689 ieee->privacy_invoked = param->value;
7690 break;
7691
7692 default:
7693 return -EOPNOTSUPP;
7694 }
7695 return ret;
7696 }
7697
7698
7699 static int ipw2100_wx_get_auth(struct net_device *dev,
7700 struct iw_request_info *info,
7701 union iwreq_data *wrqu, char *extra)
7702 {
7703 struct ipw2100_priv *priv = libipw_priv(dev);
7704 struct libipw_device *ieee = priv->ieee;
7705 struct lib80211_crypt_data *crypt;
7706 struct iw_param *param = &wrqu->param;
7707
7708 switch (param->flags & IW_AUTH_INDEX) {
7709 case IW_AUTH_WPA_VERSION:
7710 case IW_AUTH_CIPHER_PAIRWISE:
7711 case IW_AUTH_CIPHER_GROUP:
7712 case IW_AUTH_KEY_MGMT:
7713
7714
7715
7716 break;
7717
7718 case IW_AUTH_TKIP_COUNTERMEASURES:
7719 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7720 if (!crypt || !crypt->ops->get_flags) {
7721 IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
7722 "crypt not set!\n");
7723 break;
7724 }
7725
7726 param->value = (crypt->ops->get_flags(crypt->priv) &
7727 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
7728
7729 break;
7730
7731 case IW_AUTH_DROP_UNENCRYPTED:
7732 param->value = ieee->drop_unencrypted;
7733 break;
7734
7735 case IW_AUTH_80211_AUTH_ALG:
7736 param->value = priv->ieee->sec.auth_mode;
7737 break;
7738
7739 case IW_AUTH_WPA_ENABLED:
7740 param->value = ieee->wpa_enabled;
7741 break;
7742
7743 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7744 param->value = ieee->ieee802_1x;
7745 break;
7746
7747 case IW_AUTH_ROAMING_CONTROL:
7748 case IW_AUTH_PRIVACY_INVOKED:
7749 param->value = ieee->privacy_invoked;
7750 break;
7751
7752 default:
7753 return -EOPNOTSUPP;
7754 }
7755 return 0;
7756 }
7757
7758
7759 static int ipw2100_wx_set_encodeext(struct net_device *dev,
7760 struct iw_request_info *info,
7761 union iwreq_data *wrqu, char *extra)
7762 {
7763 struct ipw2100_priv *priv = libipw_priv(dev);
7764 return libipw_wx_set_encodeext(priv->ieee, info, wrqu, extra);
7765 }
7766
7767
7768 static int ipw2100_wx_get_encodeext(struct net_device *dev,
7769 struct iw_request_info *info,
7770 union iwreq_data *wrqu, char *extra)
7771 {
7772 struct ipw2100_priv *priv = libipw_priv(dev);
7773 return libipw_wx_get_encodeext(priv->ieee, info, wrqu, extra);
7774 }
7775
7776
7777 static int ipw2100_wx_set_mlme(struct net_device *dev,
7778 struct iw_request_info *info,
7779 union iwreq_data *wrqu, char *extra)
7780 {
7781 struct ipw2100_priv *priv = libipw_priv(dev);
7782 struct iw_mlme *mlme = (struct iw_mlme *)extra;
7783
7784 switch (mlme->cmd) {
7785 case IW_MLME_DEAUTH:
7786
7787 break;
7788
7789 case IW_MLME_DISASSOC:
7790 ipw2100_disassociate_bssid(priv);
7791 break;
7792
7793 default:
7794 return -EOPNOTSUPP;
7795 }
7796 return 0;
7797 }
7798
7799
7800
7801
7802
7803
7804 #ifdef CONFIG_IPW2100_MONITOR
7805 static int ipw2100_wx_set_promisc(struct net_device *dev,
7806 struct iw_request_info *info,
7807 union iwreq_data *wrqu, char *extra)
7808 {
7809 struct ipw2100_priv *priv = libipw_priv(dev);
7810 int *parms = (int *)extra;
7811 int enable = (parms[0] > 0);
7812 int err = 0;
7813
7814 mutex_lock(&priv->action_mutex);
7815 if (!(priv->status & STATUS_INITIALIZED)) {
7816 err = -EIO;
7817 goto done;
7818 }
7819
7820 if (enable) {
7821 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7822 err = ipw2100_set_channel(priv, parms[1], 0);
7823 goto done;
7824 }
7825 priv->channel = parms[1];
7826 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7827 } else {
7828 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7829 err = ipw2100_switch_mode(priv, priv->last_mode);
7830 }
7831 done:
7832 mutex_unlock(&priv->action_mutex);
7833 return err;
7834 }
7835
7836 static int ipw2100_wx_reset(struct net_device *dev,
7837 struct iw_request_info *info,
7838 union iwreq_data *wrqu, char *extra)
7839 {
7840 struct ipw2100_priv *priv = libipw_priv(dev);
7841 if (priv->status & STATUS_INITIALIZED)
7842 schedule_reset(priv);
7843 return 0;
7844 }
7845
7846 #endif
7847
7848 static int ipw2100_wx_set_powermode(struct net_device *dev,
7849 struct iw_request_info *info,
7850 union iwreq_data *wrqu, char *extra)
7851 {
7852 struct ipw2100_priv *priv = libipw_priv(dev);
7853 int err = 0, mode = *(int *)extra;
7854
7855 mutex_lock(&priv->action_mutex);
7856 if (!(priv->status & STATUS_INITIALIZED)) {
7857 err = -EIO;
7858 goto done;
7859 }
7860
7861 if ((mode < 0) || (mode > POWER_MODES))
7862 mode = IPW_POWER_AUTO;
7863
7864 if (IPW_POWER_LEVEL(priv->power_mode) != mode)
7865 err = ipw2100_set_power_mode(priv, mode);
7866 done:
7867 mutex_unlock(&priv->action_mutex);
7868 return err;
7869 }
7870
7871 #define MAX_POWER_STRING 80
7872 static int ipw2100_wx_get_powermode(struct net_device *dev,
7873 struct iw_request_info *info,
7874 union iwreq_data *wrqu, char *extra)
7875 {
7876
7877
7878
7879
7880 struct ipw2100_priv *priv = libipw_priv(dev);
7881 int level = IPW_POWER_LEVEL(priv->power_mode);
7882 s32 timeout, period;
7883
7884 if (!(priv->power_mode & IPW_POWER_ENABLED)) {
7885 snprintf(extra, MAX_POWER_STRING,
7886 "Power save level: %d (Off)", level);
7887 } else {
7888 switch (level) {
7889 case IPW_POWER_MODE_CAM:
7890 snprintf(extra, MAX_POWER_STRING,
7891 "Power save level: %d (None)", level);
7892 break;
7893 case IPW_POWER_AUTO:
7894 snprintf(extra, MAX_POWER_STRING,
7895 "Power save level: %d (Auto)", level);
7896 break;
7897 default:
7898 timeout = timeout_duration[level - 1] / 1000;
7899 period = period_duration[level - 1] / 1000;
7900 snprintf(extra, MAX_POWER_STRING,
7901 "Power save level: %d "
7902 "(Timeout %dms, Period %dms)",
7903 level, timeout, period);
7904 }
7905 }
7906
7907 wrqu->data.length = strlen(extra) + 1;
7908
7909 return 0;
7910 }
7911
7912 static int ipw2100_wx_set_preamble(struct net_device *dev,
7913 struct iw_request_info *info,
7914 union iwreq_data *wrqu, char *extra)
7915 {
7916 struct ipw2100_priv *priv = libipw_priv(dev);
7917 int err, mode = *(int *)extra;
7918
7919 mutex_lock(&priv->action_mutex);
7920 if (!(priv->status & STATUS_INITIALIZED)) {
7921 err = -EIO;
7922 goto done;
7923 }
7924
7925 if (mode == 1)
7926 priv->config |= CFG_LONG_PREAMBLE;
7927 else if (mode == 0)
7928 priv->config &= ~CFG_LONG_PREAMBLE;
7929 else {
7930 err = -EINVAL;
7931 goto done;
7932 }
7933
7934 err = ipw2100_system_config(priv, 0);
7935
7936 done:
7937 mutex_unlock(&priv->action_mutex);
7938 return err;
7939 }
7940
7941 static int ipw2100_wx_get_preamble(struct net_device *dev,
7942 struct iw_request_info *info,
7943 union iwreq_data *wrqu, char *extra)
7944 {
7945
7946
7947
7948
7949 struct ipw2100_priv *priv = libipw_priv(dev);
7950
7951 if (priv->config & CFG_LONG_PREAMBLE)
7952 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
7953 else
7954 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
7955
7956 return 0;
7957 }
7958
7959 #ifdef CONFIG_IPW2100_MONITOR
7960 static int ipw2100_wx_set_crc_check(struct net_device *dev,
7961 struct iw_request_info *info,
7962 union iwreq_data *wrqu, char *extra)
7963 {
7964 struct ipw2100_priv *priv = libipw_priv(dev);
7965 int err, mode = *(int *)extra;
7966
7967 mutex_lock(&priv->action_mutex);
7968 if (!(priv->status & STATUS_INITIALIZED)) {
7969 err = -EIO;
7970 goto done;
7971 }
7972
7973 if (mode == 1)
7974 priv->config |= CFG_CRC_CHECK;
7975 else if (mode == 0)
7976 priv->config &= ~CFG_CRC_CHECK;
7977 else {
7978 err = -EINVAL;
7979 goto done;
7980 }
7981 err = 0;
7982
7983 done:
7984 mutex_unlock(&priv->action_mutex);
7985 return err;
7986 }
7987
7988 static int ipw2100_wx_get_crc_check(struct net_device *dev,
7989 struct iw_request_info *info,
7990 union iwreq_data *wrqu, char *extra)
7991 {
7992
7993
7994
7995
7996 struct ipw2100_priv *priv = libipw_priv(dev);
7997
7998 if (priv->config & CFG_CRC_CHECK)
7999 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
8000 else
8001 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
8002
8003 return 0;
8004 }
8005 #endif
8006
8007 static iw_handler ipw2100_wx_handlers[] = {
8008 IW_HANDLER(SIOCGIWNAME, ipw2100_wx_get_name),
8009 IW_HANDLER(SIOCSIWFREQ, ipw2100_wx_set_freq),
8010 IW_HANDLER(SIOCGIWFREQ, ipw2100_wx_get_freq),
8011 IW_HANDLER(SIOCSIWMODE, ipw2100_wx_set_mode),
8012 IW_HANDLER(SIOCGIWMODE, ipw2100_wx_get_mode),
8013 IW_HANDLER(SIOCGIWRANGE, ipw2100_wx_get_range),
8014 IW_HANDLER(SIOCSIWAP, ipw2100_wx_set_wap),
8015 IW_HANDLER(SIOCGIWAP, ipw2100_wx_get_wap),
8016 IW_HANDLER(SIOCSIWMLME, ipw2100_wx_set_mlme),
8017 IW_HANDLER(SIOCSIWSCAN, ipw2100_wx_set_scan),
8018 IW_HANDLER(SIOCGIWSCAN, ipw2100_wx_get_scan),
8019 IW_HANDLER(SIOCSIWESSID, ipw2100_wx_set_essid),
8020 IW_HANDLER(SIOCGIWESSID, ipw2100_wx_get_essid),
8021 IW_HANDLER(SIOCSIWNICKN, ipw2100_wx_set_nick),
8022 IW_HANDLER(SIOCGIWNICKN, ipw2100_wx_get_nick),
8023 IW_HANDLER(SIOCSIWRATE, ipw2100_wx_set_rate),
8024 IW_HANDLER(SIOCGIWRATE, ipw2100_wx_get_rate),
8025 IW_HANDLER(SIOCSIWRTS, ipw2100_wx_set_rts),
8026 IW_HANDLER(SIOCGIWRTS, ipw2100_wx_get_rts),
8027 IW_HANDLER(SIOCSIWFRAG, ipw2100_wx_set_frag),
8028 IW_HANDLER(SIOCGIWFRAG, ipw2100_wx_get_frag),
8029 IW_HANDLER(SIOCSIWTXPOW, ipw2100_wx_set_txpow),
8030 IW_HANDLER(SIOCGIWTXPOW, ipw2100_wx_get_txpow),
8031 IW_HANDLER(SIOCSIWRETRY, ipw2100_wx_set_retry),
8032 IW_HANDLER(SIOCGIWRETRY, ipw2100_wx_get_retry),
8033 IW_HANDLER(SIOCSIWENCODE, ipw2100_wx_set_encode),
8034 IW_HANDLER(SIOCGIWENCODE, ipw2100_wx_get_encode),
8035 IW_HANDLER(SIOCSIWPOWER, ipw2100_wx_set_power),
8036 IW_HANDLER(SIOCGIWPOWER, ipw2100_wx_get_power),
8037 IW_HANDLER(SIOCSIWGENIE, ipw2100_wx_set_genie),
8038 IW_HANDLER(SIOCGIWGENIE, ipw2100_wx_get_genie),
8039 IW_HANDLER(SIOCSIWAUTH, ipw2100_wx_set_auth),
8040 IW_HANDLER(SIOCGIWAUTH, ipw2100_wx_get_auth),
8041 IW_HANDLER(SIOCSIWENCODEEXT, ipw2100_wx_set_encodeext),
8042 IW_HANDLER(SIOCGIWENCODEEXT, ipw2100_wx_get_encodeext),
8043 };
8044
8045 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8046 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8047 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8048 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8049 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8050 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8051 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8052 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8053
8054 static const struct iw_priv_args ipw2100_private_args[] = {
8055
8056 #ifdef CONFIG_IPW2100_MONITOR
8057 {
8058 IPW2100_PRIV_SET_MONITOR,
8059 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
8060 {
8061 IPW2100_PRIV_RESET,
8062 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
8063 #endif
8064
8065 {
8066 IPW2100_PRIV_SET_POWER,
8067 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
8068 {
8069 IPW2100_PRIV_GET_POWER,
8070 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
8071 "get_power"},
8072 {
8073 IPW2100_PRIV_SET_LONGPREAMBLE,
8074 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
8075 {
8076 IPW2100_PRIV_GET_LONGPREAMBLE,
8077 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
8078 #ifdef CONFIG_IPW2100_MONITOR
8079 {
8080 IPW2100_PRIV_SET_CRC_CHECK,
8081 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8082 {
8083 IPW2100_PRIV_GET_CRC_CHECK,
8084 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8085 #endif
8086 };
8087
8088 static iw_handler ipw2100_private_handler[] = {
8089 #ifdef CONFIG_IPW2100_MONITOR
8090 ipw2100_wx_set_promisc,
8091 ipw2100_wx_reset,
8092 #else
8093 NULL,
8094 NULL,
8095 #endif
8096 ipw2100_wx_set_powermode,
8097 ipw2100_wx_get_powermode,
8098 ipw2100_wx_set_preamble,
8099 ipw2100_wx_get_preamble,
8100 #ifdef CONFIG_IPW2100_MONITOR
8101 ipw2100_wx_set_crc_check,
8102 ipw2100_wx_get_crc_check,
8103 #else
8104 NULL,
8105 NULL,
8106 #endif
8107 };
8108
8109
8110
8111
8112
8113
8114 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8115 {
8116 enum {
8117 POOR = 30,
8118 FAIR = 60,
8119 GOOD = 80,
8120 VERY_GOOD = 90,
8121 EXCELLENT = 95,
8122 PERFECT = 100
8123 };
8124 int rssi_qual;
8125 int tx_qual;
8126 int beacon_qual;
8127 int quality;
8128
8129 struct ipw2100_priv *priv = libipw_priv(dev);
8130 struct iw_statistics *wstats;
8131 u32 rssi, tx_retries, missed_beacons, tx_failures;
8132 u32 ord_len = sizeof(u32);
8133
8134 if (!priv)
8135 return (struct iw_statistics *)NULL;
8136
8137 wstats = &priv->wstats;
8138
8139
8140
8141
8142
8143
8144 if (!(priv->status & STATUS_ASSOCIATED)) {
8145 wstats->miss.beacon = 0;
8146 wstats->discard.retries = 0;
8147 wstats->qual.qual = 0;
8148 wstats->qual.level = 0;
8149 wstats->qual.noise = 0;
8150 wstats->qual.updated = 7;
8151 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8152 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8153 return wstats;
8154 }
8155
8156 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS,
8157 &missed_beacons, &ord_len))
8158 goto fail_get_ordinal;
8159
8160
8161 if (!(priv->status & STATUS_ASSOCIATED)) {
8162 wstats->qual.qual = 0;
8163 wstats->qual.level = 0;
8164 } else {
8165 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR,
8166 &rssi, &ord_len))
8167 goto fail_get_ordinal;
8168 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8169 if (rssi < 10)
8170 rssi_qual = rssi * POOR / 10;
8171 else if (rssi < 15)
8172 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR;
8173 else if (rssi < 20)
8174 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8175 else if (rssi < 30)
8176 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8177 10 + GOOD;
8178 else
8179 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8180 10 + VERY_GOOD;
8181
8182 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8183 &tx_retries, &ord_len))
8184 goto fail_get_ordinal;
8185
8186 if (tx_retries > 75)
8187 tx_qual = (90 - tx_retries) * POOR / 15;
8188 else if (tx_retries > 70)
8189 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR;
8190 else if (tx_retries > 65)
8191 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8192 else if (tx_retries > 50)
8193 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8194 15 + GOOD;
8195 else
8196 tx_qual = (50 - tx_retries) *
8197 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8198
8199 if (missed_beacons > 50)
8200 beacon_qual = (60 - missed_beacons) * POOR / 10;
8201 else if (missed_beacons > 40)
8202 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8203 10 + POOR;
8204 else if (missed_beacons > 32)
8205 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8206 18 + FAIR;
8207 else if (missed_beacons > 20)
8208 beacon_qual = (32 - missed_beacons) *
8209 (VERY_GOOD - GOOD) / 20 + GOOD;
8210 else
8211 beacon_qual = (20 - missed_beacons) *
8212 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8213
8214 quality = min(tx_qual, rssi_qual);
8215 quality = min(beacon_qual, quality);
8216
8217 #ifdef CONFIG_IPW2100_DEBUG
8218 if (beacon_qual == quality)
8219 IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
8220 else if (tx_qual == quality)
8221 IPW_DEBUG_WX("Quality clamped by Tx Retries\n");
8222 else if (quality != 100)
8223 IPW_DEBUG_WX("Quality clamped by Signal Strength\n");
8224 else
8225 IPW_DEBUG_WX("Quality not clamped.\n");
8226 #endif
8227
8228 wstats->qual.qual = quality;
8229 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8230 }
8231
8232 wstats->qual.noise = 0;
8233 wstats->qual.updated = 7;
8234 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8235
8236
8237 wstats->miss.beacon = missed_beacons;
8238
8239 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
8240 &tx_failures, &ord_len))
8241 goto fail_get_ordinal;
8242 wstats->discard.retries = tx_failures;
8243
8244 return wstats;
8245
8246 fail_get_ordinal:
8247 IPW_DEBUG_WX("failed querying ordinals.\n");
8248
8249 return (struct iw_statistics *)NULL;
8250 }
8251
8252 static const struct iw_handler_def ipw2100_wx_handler_def = {
8253 .standard = ipw2100_wx_handlers,
8254 .num_standard = ARRAY_SIZE(ipw2100_wx_handlers),
8255 .num_private = ARRAY_SIZE(ipw2100_private_handler),
8256 .num_private_args = ARRAY_SIZE(ipw2100_private_args),
8257 .private = (iw_handler *) ipw2100_private_handler,
8258 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8259 .get_wireless_stats = ipw2100_wx_wireless_stats,
8260 };
8261
8262 static void ipw2100_wx_event_work(struct work_struct *work)
8263 {
8264 struct ipw2100_priv *priv =
8265 container_of(work, struct ipw2100_priv, wx_event_work.work);
8266 union iwreq_data wrqu;
8267 unsigned int len = ETH_ALEN;
8268
8269 if (priv->status & STATUS_STOPPING)
8270 return;
8271
8272 mutex_lock(&priv->action_mutex);
8273
8274 IPW_DEBUG_WX("enter\n");
8275
8276 mutex_unlock(&priv->action_mutex);
8277
8278 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8279
8280
8281 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8282 priv->status & STATUS_RF_KILL_MASK ||
8283 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8284 &priv->bssid, &len)) {
8285 eth_zero_addr(wrqu.ap_addr.sa_data);
8286 } else {
8287
8288
8289 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8290 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8291 priv->status &= ~STATUS_ASSOCIATING;
8292 priv->status |= STATUS_ASSOCIATED;
8293 netif_carrier_on(priv->net_dev);
8294 netif_wake_queue(priv->net_dev);
8295 }
8296
8297 if (!(priv->status & STATUS_ASSOCIATED)) {
8298 IPW_DEBUG_WX("Configuring ESSID\n");
8299 mutex_lock(&priv->action_mutex);
8300
8301
8302 if (priv->config & CFG_STATIC_ESSID)
8303 ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8304 0);
8305 else
8306 ipw2100_set_essid(priv, NULL, 0, 0);
8307 mutex_unlock(&priv->action_mutex);
8308 }
8309
8310 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
8311 }
8312
8313 #define IPW2100_FW_MAJOR_VERSION 1
8314 #define IPW2100_FW_MINOR_VERSION 3
8315
8316 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8317 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8318
8319 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8320 IPW2100_FW_MAJOR_VERSION)
8321
8322 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8323 "." __stringify(IPW2100_FW_MINOR_VERSION)
8324
8325 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341 struct ipw2100_fw_header {
8342 short version;
8343 short mode;
8344 unsigned int fw_size;
8345 unsigned int uc_size;
8346 } __packed;
8347
8348 static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8349 {
8350 struct ipw2100_fw_header *h =
8351 (struct ipw2100_fw_header *)fw->fw_entry->data;
8352
8353 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8354 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
8355 "(detected version id of %u). "
8356 "See Documentation/networking/device_drivers/intel/ipw2100.txt\n",
8357 h->version);
8358 return 1;
8359 }
8360
8361 fw->version = h->version;
8362 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header);
8363 fw->fw.size = h->fw_size;
8364 fw->uc.data = fw->fw.data + h->fw_size;
8365 fw->uc.size = h->uc_size;
8366
8367 return 0;
8368 }
8369
8370 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8371 struct ipw2100_fw *fw)
8372 {
8373 char *fw_name;
8374 int rc;
8375
8376 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8377 priv->net_dev->name);
8378
8379 switch (priv->ieee->iw_mode) {
8380 case IW_MODE_ADHOC:
8381 fw_name = IPW2100_FW_NAME("-i");
8382 break;
8383 #ifdef CONFIG_IPW2100_MONITOR
8384 case IW_MODE_MONITOR:
8385 fw_name = IPW2100_FW_NAME("-p");
8386 break;
8387 #endif
8388 case IW_MODE_INFRA:
8389 default:
8390 fw_name = IPW2100_FW_NAME("");
8391 break;
8392 }
8393
8394 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
8395
8396 if (rc < 0) {
8397 printk(KERN_ERR DRV_NAME ": "
8398 "%s: Firmware '%s' not available or load failed.\n",
8399 priv->net_dev->name, fw_name);
8400 return rc;
8401 }
8402 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8403 fw->fw_entry->size);
8404
8405 ipw2100_mod_firmware_load(fw);
8406
8407 return 0;
8408 }
8409
8410 MODULE_FIRMWARE(IPW2100_FW_NAME("-i"));
8411 #ifdef CONFIG_IPW2100_MONITOR
8412 MODULE_FIRMWARE(IPW2100_FW_NAME("-p"));
8413 #endif
8414 MODULE_FIRMWARE(IPW2100_FW_NAME(""));
8415
8416 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8417 struct ipw2100_fw *fw)
8418 {
8419 fw->version = 0;
8420 release_firmware(fw->fw_entry);
8421 fw->fw_entry = NULL;
8422 }
8423
8424 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8425 size_t max)
8426 {
8427 char ver[MAX_FW_VERSION_LEN];
8428 u32 len = MAX_FW_VERSION_LEN;
8429 u32 tmp;
8430 int i;
8431
8432 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8433 return -EIO;
8434 tmp = max;
8435 if (len >= max)
8436 len = max - 1;
8437 for (i = 0; i < len; i++)
8438 buf[i] = ver[i];
8439 buf[i] = '\0';
8440 return tmp;
8441 }
8442
8443 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8444 size_t max)
8445 {
8446 u32 ver;
8447 u32 len = sizeof(ver);
8448
8449 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8450 return -EIO;
8451 return snprintf(buf, max, "%08X", ver);
8452 }
8453
8454
8455
8456
8457 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8458 {
8459
8460
8461
8462
8463
8464
8465
8466
8467 unsigned int addr;
8468 unsigned short len;
8469
8470 const unsigned char *firmware_data = fw->fw.data;
8471 unsigned int firmware_data_left = fw->fw.size;
8472
8473 while (firmware_data_left > 0) {
8474 addr = *(u32 *) (firmware_data);
8475 firmware_data += 4;
8476 firmware_data_left -= 4;
8477
8478 len = *(u16 *) (firmware_data);
8479 firmware_data += 2;
8480 firmware_data_left -= 2;
8481
8482 if (len > 32) {
8483 printk(KERN_ERR DRV_NAME ": "
8484 "Invalid firmware run-length of %d bytes\n",
8485 len);
8486 return -EINVAL;
8487 }
8488
8489 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8490 firmware_data += len;
8491 firmware_data_left -= len;
8492 }
8493
8494 return 0;
8495 }
8496
8497 struct symbol_alive_response {
8498 u8 cmd_id;
8499 u8 seq_num;
8500 u8 ucode_rev;
8501 u8 eeprom_valid;
8502 u16 valid_flags;
8503 u8 IEEE_addr[6];
8504 u16 flags;
8505 u16 pcb_rev;
8506 u16 clock_settle_time;
8507 u16 powerup_settle_time;
8508 u16 hop_settle_time;
8509 u8 date[3];
8510 u8 time[2];
8511 u8 ucode_valid;
8512 };
8513
8514 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8515 struct ipw2100_fw *fw)
8516 {
8517 struct net_device *dev = priv->net_dev;
8518 const unsigned char *microcode_data = fw->uc.data;
8519 unsigned int microcode_data_left = fw->uc.size;
8520 void __iomem *reg = priv->ioaddr;
8521
8522 struct symbol_alive_response response;
8523 int i, j;
8524 u8 data;
8525
8526
8527 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8528 readl(reg);
8529 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8530 readl(reg);
8531
8532
8533 write_nic_byte(dev, 0x210014, 0x72);
8534 readl(reg);
8535 write_nic_byte(dev, 0x210014, 0x72);
8536 readl(reg);
8537
8538
8539 write_nic_byte(dev, 0x210000, 0x40);
8540 readl(reg);
8541 write_nic_byte(dev, 0x210000, 0x0);
8542 readl(reg);
8543 write_nic_byte(dev, 0x210000, 0x40);
8544 readl(reg);
8545
8546
8547
8548 while (microcode_data_left > 0) {
8549 write_nic_byte(dev, 0x210010, *microcode_data++);
8550 write_nic_byte(dev, 0x210010, *microcode_data++);
8551 microcode_data_left -= 2;
8552 }
8553
8554
8555 write_nic_byte(dev, 0x210000, 0x0);
8556 readl(reg);
8557
8558
8559
8560 write_nic_byte(dev, 0x210000, 0x0);
8561 readl(reg);
8562 write_nic_byte(dev, 0x210000, 0x80);
8563 readl(reg);
8564
8565
8566 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8567 readl(reg);
8568 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8569 readl(reg);
8570
8571
8572 write_nic_byte(dev, 0x210014, 0x72);
8573 readl(reg);
8574 write_nic_byte(dev, 0x210014, 0x72);
8575 readl(reg);
8576
8577
8578
8579 write_nic_byte(dev, 0x210000, 0x00);
8580 readl(reg);
8581 write_nic_byte(dev, 0x210000, 0x80);
8582
8583
8584
8585 for (i = 0; i < 10; i++) {
8586 udelay(10);
8587
8588
8589 read_nic_byte(dev, 0x210000, &data);
8590 if (data & 0x1)
8591 break;
8592 }
8593
8594 if (i == 10) {
8595 printk(KERN_ERR DRV_NAME ": %s: Error initializing Symbol\n",
8596 dev->name);
8597 return -EIO;
8598 }
8599
8600
8601 for (i = 0; i < 30; i++) {
8602
8603 for (j = 0;
8604 j < (sizeof(struct symbol_alive_response) >> 1); j++)
8605 read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8606
8607 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8608 break;
8609 udelay(10);
8610 }
8611
8612 if (i == 30) {
8613 printk(KERN_ERR DRV_NAME
8614 ": %s: No response from Symbol - hw not alive\n",
8615 dev->name);
8616 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));
8617 return -EIO;
8618 }
8619
8620 return 0;
8621 }