aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ipw2100.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ipw2100.c')
-rw-r--r--drivers/net/wireless/ipw2100.c220
1 files changed, 147 insertions, 73 deletions
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c
index eb79198ac450..72335c8eb97f 100644
--- a/drivers/net/wireless/ipw2100.c
+++ b/drivers/net/wireless/ipw2100.c
@@ -1,6 +1,6 @@
1/****************************************************************************** 1/******************************************************************************
2 2
3 Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. 3 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
4 4
5 This program is free software; you can redistribute it and/or modify it 5 This program is free software; you can redistribute it and/or modify it
6 under the terms of version 2 of the GNU General Public License as 6 under the terms of version 2 of the GNU General Public License as
@@ -167,12 +167,12 @@ that only one external action is invoked at a time.
167 167
168#include "ipw2100.h" 168#include "ipw2100.h"
169 169
170#define IPW2100_VERSION "git-1.1.4" 170#define IPW2100_VERSION "git-1.2.2"
171 171
172#define DRV_NAME "ipw2100" 172#define DRV_NAME "ipw2100"
173#define DRV_VERSION IPW2100_VERSION 173#define DRV_VERSION IPW2100_VERSION
174#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver" 174#define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
175#define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation" 175#define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation"
176 176
177/* Debugging stuff */ 177/* Debugging stuff */
178#ifdef CONFIG_IPW2100_DEBUG 178#ifdef CONFIG_IPW2100_DEBUG
@@ -1418,7 +1418,7 @@ static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1418 if (priv->status & STATUS_ENABLED) 1418 if (priv->status & STATUS_ENABLED)
1419 return 0; 1419 return 0;
1420 1420
1421 down(&priv->adapter_sem); 1421 mutex_lock(&priv->adapter_mutex);
1422 1422
1423 if (rf_kill_active(priv)) { 1423 if (rf_kill_active(priv)) {
1424 IPW_DEBUG_HC("Command aborted due to RF kill active.\n"); 1424 IPW_DEBUG_HC("Command aborted due to RF kill active.\n");
@@ -1444,7 +1444,7 @@ static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1444 } 1444 }
1445 1445
1446 fail_up: 1446 fail_up:
1447 up(&priv->adapter_sem); 1447 mutex_unlock(&priv->adapter_mutex);
1448 return err; 1448 return err;
1449} 1449}
1450 1450
@@ -1576,7 +1576,7 @@ static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1576 cancel_delayed_work(&priv->hang_check); 1576 cancel_delayed_work(&priv->hang_check);
1577 } 1577 }
1578 1578
1579 down(&priv->adapter_sem); 1579 mutex_lock(&priv->adapter_mutex);
1580 1580
1581 err = ipw2100_hw_send_command(priv, &cmd); 1581 err = ipw2100_hw_send_command(priv, &cmd);
1582 if (err) { 1582 if (err) {
@@ -1595,7 +1595,7 @@ static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1595 IPW_DEBUG_INFO("TODO: implement scan state machine\n"); 1595 IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1596 1596
1597 fail_up: 1597 fail_up:
1598 up(&priv->adapter_sem); 1598 mutex_unlock(&priv->adapter_mutex);
1599 return err; 1599 return err;
1600} 1600}
1601 1601
@@ -1888,7 +1888,7 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv)
1888 priv->status |= STATUS_RESET_PENDING; 1888 priv->status |= STATUS_RESET_PENDING;
1889 spin_unlock_irqrestore(&priv->low_lock, flags); 1889 spin_unlock_irqrestore(&priv->low_lock, flags);
1890 1890
1891 down(&priv->action_sem); 1891 mutex_lock(&priv->action_mutex);
1892 /* stop timed checks so that they don't interfere with reset */ 1892 /* stop timed checks so that they don't interfere with reset */
1893 priv->stop_hang_check = 1; 1893 priv->stop_hang_check = 1;
1894 cancel_delayed_work(&priv->hang_check); 1894 cancel_delayed_work(&priv->hang_check);
@@ -1898,7 +1898,7 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv)
1898 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); 1898 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1899 1899
1900 ipw2100_up(priv, 0); 1900 ipw2100_up(priv, 0);
1901 up(&priv->action_sem); 1901 mutex_unlock(&priv->action_mutex);
1902 1902
1903} 1903}
1904 1904
@@ -2390,15 +2390,6 @@ static void isr_rx(struct ipw2100_priv *priv, int i,
2390 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); 2390 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2391 return; 2391 return;
2392 } 2392 }
2393#ifdef CONFIG_IPW2100_MONITOR
2394 if (unlikely(priv->ieee->iw_mode == IW_MODE_MONITOR &&
2395 priv->config & CFG_CRC_CHECK &&
2396 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2397 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2398 priv->ieee->stats.rx_errors++;
2399 return;
2400 }
2401#endif
2402 2393
2403 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && 2394 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2404 !(priv->status & STATUS_ASSOCIATED))) { 2395 !(priv->status & STATUS_ASSOCIATED))) {
@@ -2446,6 +2437,89 @@ static void isr_rx(struct ipw2100_priv *priv, int i,
2446 priv->rx_queue.drv[i].host_addr = packet->dma_addr; 2437 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2447} 2438}
2448 2439
2440#ifdef CONFIG_IPW2100_MONITOR
2441
2442static void isr_rx_monitor(struct ipw2100_priv *priv, int i,
2443 struct ieee80211_rx_stats *stats)
2444{
2445 struct ipw2100_status *status = &priv->status_queue.drv[i];
2446 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2447
2448 /* Magic struct that slots into the radiotap header -- no reason
2449 * to build this manually element by element, we can write it much
2450 * more efficiently than we can parse it. ORDER MATTERS HERE */
2451 struct ipw_rt_hdr {
2452 struct ieee80211_radiotap_header rt_hdr;
2453 s8 rt_dbmsignal; /* signal in dbM, kluged to signed */
2454 } *ipw_rt;
2455
2456 IPW_DEBUG_RX("Handler...\n");
2457
2458 if (unlikely(status->frame_size > skb_tailroom(packet->skb) -
2459 sizeof(struct ipw_rt_hdr))) {
2460 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2461 " Dropping.\n",
2462 priv->net_dev->name,
2463 status->frame_size,
2464 skb_tailroom(packet->skb));
2465 priv->ieee->stats.rx_errors++;
2466 return;
2467 }
2468
2469 if (unlikely(!netif_running(priv->net_dev))) {
2470 priv->ieee->stats.rx_errors++;
2471 priv->wstats.discard.misc++;
2472 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2473 return;
2474 }
2475
2476 if (unlikely(priv->config & CFG_CRC_CHECK &&
2477 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2478 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2479 priv->ieee->stats.rx_errors++;
2480 return;
2481 }
2482
2483 pci_unmap_single(priv->pci_dev, packet->dma_addr,
2484 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2485 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr),
2486 packet->skb->data, status->frame_size);
2487
2488 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data;
2489
2490 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
2491 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */
2492 ipw_rt->rt_hdr.it_len = sizeof(struct ipw_rt_hdr); /* total hdr+data */
2493
2494 ipw_rt->rt_hdr.it_present = 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL;
2495
2496 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM;
2497
2498 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr));
2499
2500 if (!ieee80211_rx(priv->ieee, packet->skb, stats)) {
2501 priv->ieee->stats.rx_errors++;
2502
2503 /* ieee80211_rx failed, so it didn't free the SKB */
2504 dev_kfree_skb_any(packet->skb);
2505 packet->skb = NULL;
2506 }
2507
2508 /* We need to allocate a new SKB and attach it to the RDB. */
2509 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2510 IPW_DEBUG_WARNING(
2511 "%s: Unable to allocate SKB onto RBD ring - disabling "
2512 "adapter.\n", priv->net_dev->name);
2513 /* TODO: schedule adapter shutdown */
2514 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2515 }
2516
2517 /* Update the RDB entry */
2518 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2519}
2520
2521#endif
2522
2449static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i) 2523static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2450{ 2524{
2451 struct ipw2100_status *status = &priv->status_queue.drv[i]; 2525 struct ipw2100_status *status = &priv->status_queue.drv[i];
@@ -2577,7 +2651,7 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2577 case P8023_DATA_VAL: 2651 case P8023_DATA_VAL:
2578#ifdef CONFIG_IPW2100_MONITOR 2652#ifdef CONFIG_IPW2100_MONITOR
2579 if (priv->ieee->iw_mode == IW_MODE_MONITOR) { 2653 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2580 isr_rx(priv, i, &stats); 2654 isr_rx_monitor(priv, i, &stats);
2581 break; 2655 break;
2582 } 2656 }
2583#endif 2657#endif
@@ -3882,7 +3956,7 @@ static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3882#ifdef CONFIG_IPW2100_MONITOR 3956#ifdef CONFIG_IPW2100_MONITOR
3883 case IW_MODE_MONITOR: 3957 case IW_MODE_MONITOR:
3884 priv->last_mode = priv->ieee->iw_mode; 3958 priv->last_mode = priv->ieee->iw_mode;
3885 priv->net_dev->type = ARPHRD_IEEE80211; 3959 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
3886 break; 3960 break;
3887#endif /* CONFIG_IPW2100_MONITOR */ 3961#endif /* CONFIG_IPW2100_MONITOR */
3888 } 3962 }
@@ -4138,7 +4212,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4138 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n", 4212 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4139 disable_radio ? "OFF" : "ON"); 4213 disable_radio ? "OFF" : "ON");
4140 4214
4141 down(&priv->action_sem); 4215 mutex_lock(&priv->action_mutex);
4142 4216
4143 if (disable_radio) { 4217 if (disable_radio) {
4144 priv->status |= STATUS_RF_KILL_SW; 4218 priv->status |= STATUS_RF_KILL_SW;
@@ -4156,7 +4230,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4156 schedule_reset(priv); 4230 schedule_reset(priv);
4157 } 4231 }
4158 4232
4159 up(&priv->action_sem); 4233 mutex_unlock(&priv->action_mutex);
4160 return 1; 4234 return 1;
4161} 4235}
4162 4236
@@ -5460,7 +5534,7 @@ static void shim__set_security(struct net_device *dev,
5460 struct ipw2100_priv *priv = ieee80211_priv(dev); 5534 struct ipw2100_priv *priv = ieee80211_priv(dev);
5461 int i, force_update = 0; 5535 int i, force_update = 0;
5462 5536
5463 down(&priv->action_sem); 5537 mutex_lock(&priv->action_mutex);
5464 if (!(priv->status & STATUS_INITIALIZED)) 5538 if (!(priv->status & STATUS_INITIALIZED))
5465 goto done; 5539 goto done;
5466 5540
@@ -5533,7 +5607,7 @@ static void shim__set_security(struct net_device *dev,
5533 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) 5607 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5534 ipw2100_configure_security(priv, 0); 5608 ipw2100_configure_security(priv, 0);
5535 done: 5609 done:
5536 up(&priv->action_sem); 5610 mutex_unlock(&priv->action_mutex);
5537} 5611}
5538 5612
5539static int ipw2100_adapter_setup(struct ipw2100_priv *priv) 5613static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
@@ -5657,7 +5731,7 @@ static int ipw2100_set_address(struct net_device *dev, void *p)
5657 if (!is_valid_ether_addr(addr->sa_data)) 5731 if (!is_valid_ether_addr(addr->sa_data))
5658 return -EADDRNOTAVAIL; 5732 return -EADDRNOTAVAIL;
5659 5733
5660 down(&priv->action_sem); 5734 mutex_lock(&priv->action_mutex);
5661 5735
5662 priv->config |= CFG_CUSTOM_MAC; 5736 priv->config |= CFG_CUSTOM_MAC;
5663 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); 5737 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
@@ -5667,12 +5741,12 @@ static int ipw2100_set_address(struct net_device *dev, void *p)
5667 goto done; 5741 goto done;
5668 5742
5669 priv->reset_backoff = 0; 5743 priv->reset_backoff = 0;
5670 up(&priv->action_sem); 5744 mutex_unlock(&priv->action_mutex);
5671 ipw2100_reset_adapter(priv); 5745 ipw2100_reset_adapter(priv);
5672 return 0; 5746 return 0;
5673 5747
5674 done: 5748 done:
5675 up(&priv->action_sem); 5749 mutex_unlock(&priv->action_mutex);
5676 return err; 5750 return err;
5677} 5751}
5678 5752
@@ -6015,8 +6089,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6015 strcpy(priv->nick, "ipw2100"); 6089 strcpy(priv->nick, "ipw2100");
6016 6090
6017 spin_lock_init(&priv->low_lock); 6091 spin_lock_init(&priv->low_lock);
6018 sema_init(&priv->action_sem, 1); 6092 mutex_init(&priv->action_mutex);
6019 sema_init(&priv->adapter_sem, 1); 6093 mutex_init(&priv->adapter_mutex);
6020 6094
6021 init_waitqueue_head(&priv->wait_command_queue); 6095 init_waitqueue_head(&priv->wait_command_queue);
6022 6096
@@ -6181,7 +6255,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6181 * member to call a function that then just turns and calls ipw2100_up. 6255 * member to call a function that then just turns and calls ipw2100_up.
6182 * net_dev->init is called after name allocation but before the 6256 * net_dev->init is called after name allocation but before the
6183 * notifier chain is called */ 6257 * notifier chain is called */
6184 down(&priv->action_sem); 6258 mutex_lock(&priv->action_mutex);
6185 err = register_netdev(dev); 6259 err = register_netdev(dev);
6186 if (err) { 6260 if (err) {
6187 printk(KERN_WARNING DRV_NAME 6261 printk(KERN_WARNING DRV_NAME
@@ -6217,12 +6291,12 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6217 6291
6218 priv->status |= STATUS_INITIALIZED; 6292 priv->status |= STATUS_INITIALIZED;
6219 6293
6220 up(&priv->action_sem); 6294 mutex_unlock(&priv->action_mutex);
6221 6295
6222 return 0; 6296 return 0;
6223 6297
6224 fail_unlock: 6298 fail_unlock:
6225 up(&priv->action_sem); 6299 mutex_unlock(&priv->action_mutex);
6226 6300
6227 fail: 6301 fail:
6228 if (dev) { 6302 if (dev) {
@@ -6262,7 +6336,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6262 struct net_device *dev; 6336 struct net_device *dev;
6263 6337
6264 if (priv) { 6338 if (priv) {
6265 down(&priv->action_sem); 6339 mutex_lock(&priv->action_mutex);
6266 6340
6267 priv->status &= ~STATUS_INITIALIZED; 6341 priv->status &= ~STATUS_INITIALIZED;
6268 6342
@@ -6277,9 +6351,9 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6277 /* Take down the hardware */ 6351 /* Take down the hardware */
6278 ipw2100_down(priv); 6352 ipw2100_down(priv);
6279 6353
6280 /* Release the semaphore so that the network subsystem can 6354 /* Release the mutex so that the network subsystem can
6281 * complete any needed calls into the driver... */ 6355 * complete any needed calls into the driver... */
6282 up(&priv->action_sem); 6356 mutex_unlock(&priv->action_mutex);
6283 6357
6284 /* Unregister the device first - this results in close() 6358 /* Unregister the device first - this results in close()
6285 * being called if the device is open. If we free storage 6359 * being called if the device is open. If we free storage
@@ -6318,7 +6392,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6318 6392
6319 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); 6393 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6320 6394
6321 down(&priv->action_sem); 6395 mutex_lock(&priv->action_mutex);
6322 if (priv->status & STATUS_INITIALIZED) { 6396 if (priv->status & STATUS_INITIALIZED) {
6323 /* Take down the device; powers it off, etc. */ 6397 /* Take down the device; powers it off, etc. */
6324 ipw2100_down(priv); 6398 ipw2100_down(priv);
@@ -6331,7 +6405,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6331 pci_disable_device(pci_dev); 6405 pci_disable_device(pci_dev);
6332 pci_set_power_state(pci_dev, PCI_D3hot); 6406 pci_set_power_state(pci_dev, PCI_D3hot);
6333 6407
6334 up(&priv->action_sem); 6408 mutex_unlock(&priv->action_mutex);
6335 6409
6336 return 0; 6410 return 0;
6337} 6411}
@@ -6345,7 +6419,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
6345 if (IPW2100_PM_DISABLED) 6419 if (IPW2100_PM_DISABLED)
6346 return 0; 6420 return 0;
6347 6421
6348 down(&priv->action_sem); 6422 mutex_lock(&priv->action_mutex);
6349 6423
6350 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); 6424 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6351 6425
@@ -6371,7 +6445,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev)
6371 if (!(priv->status & STATUS_RF_KILL_SW)) 6445 if (!(priv->status & STATUS_RF_KILL_SW))
6372 ipw2100_up(priv, 0); 6446 ipw2100_up(priv, 0);
6373 6447
6374 up(&priv->action_sem); 6448 mutex_unlock(&priv->action_mutex);
6375 6449
6376 return 0; 6450 return 0;
6377} 6451}
@@ -6535,7 +6609,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev,
6535 if (priv->ieee->iw_mode == IW_MODE_INFRA) 6609 if (priv->ieee->iw_mode == IW_MODE_INFRA)
6536 return -EOPNOTSUPP; 6610 return -EOPNOTSUPP;
6537 6611
6538 down(&priv->action_sem); 6612 mutex_lock(&priv->action_mutex);
6539 if (!(priv->status & STATUS_INITIALIZED)) { 6613 if (!(priv->status & STATUS_INITIALIZED)) {
6540 err = -EIO; 6614 err = -EIO;
6541 goto done; 6615 goto done;
@@ -6566,7 +6640,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev,
6566 } 6640 }
6567 6641
6568 done: 6642 done:
6569 up(&priv->action_sem); 6643 mutex_unlock(&priv->action_mutex);
6570 return err; 6644 return err;
6571} 6645}
6572 6646
@@ -6607,7 +6681,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev,
6607 if (wrqu->mode == priv->ieee->iw_mode) 6681 if (wrqu->mode == priv->ieee->iw_mode)
6608 return 0; 6682 return 0;
6609 6683
6610 down(&priv->action_sem); 6684 mutex_lock(&priv->action_mutex);
6611 if (!(priv->status & STATUS_INITIALIZED)) { 6685 if (!(priv->status & STATUS_INITIALIZED)) {
6612 err = -EIO; 6686 err = -EIO;
6613 goto done; 6687 goto done;
@@ -6630,7 +6704,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev,
6630 } 6704 }
6631 6705
6632 done: 6706 done:
6633 up(&priv->action_sem); 6707 mutex_unlock(&priv->action_mutex);
6634 return err; 6708 return err;
6635} 6709}
6636 6710
@@ -6812,7 +6886,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev,
6812 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) 6886 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6813 return -EINVAL; 6887 return -EINVAL;
6814 6888
6815 down(&priv->action_sem); 6889 mutex_lock(&priv->action_mutex);
6816 if (!(priv->status & STATUS_INITIALIZED)) { 6890 if (!(priv->status & STATUS_INITIALIZED)) {
6817 err = -EIO; 6891 err = -EIO;
6818 goto done; 6892 goto done;
@@ -6841,7 +6915,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev,
6841 wrqu->ap_addr.sa_data[5] & 0xff); 6915 wrqu->ap_addr.sa_data[5] & 0xff);
6842 6916
6843 done: 6917 done:
6844 up(&priv->action_sem); 6918 mutex_unlock(&priv->action_mutex);
6845 return err; 6919 return err;
6846} 6920}
6847 6921
@@ -6877,7 +6951,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev,
6877 int length = 0; 6951 int length = 0;
6878 int err = 0; 6952 int err = 0;
6879 6953
6880 down(&priv->action_sem); 6954 mutex_lock(&priv->action_mutex);
6881 if (!(priv->status & STATUS_INITIALIZED)) { 6955 if (!(priv->status & STATUS_INITIALIZED)) {
6882 err = -EIO; 6956 err = -EIO;
6883 goto done; 6957 goto done;
@@ -6914,7 +6988,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev,
6914 err = ipw2100_set_essid(priv, essid, length, 0); 6988 err = ipw2100_set_essid(priv, essid, length, 0);
6915 6989
6916 done: 6990 done:
6917 up(&priv->action_sem); 6991 mutex_unlock(&priv->action_mutex);
6918 return err; 6992 return err;
6919} 6993}
6920 6994
@@ -6995,7 +7069,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev,
6995 u32 rate; 7069 u32 rate;
6996 int err = 0; 7070 int err = 0;
6997 7071
6998 down(&priv->action_sem); 7072 mutex_lock(&priv->action_mutex);
6999 if (!(priv->status & STATUS_INITIALIZED)) { 7073 if (!(priv->status & STATUS_INITIALIZED)) {
7000 err = -EIO; 7074 err = -EIO;
7001 goto done; 7075 goto done;
@@ -7022,7 +7096,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev,
7022 7096
7023 IPW_DEBUG_WX("SET Rate -> %04X \n", rate); 7097 IPW_DEBUG_WX("SET Rate -> %04X \n", rate);
7024 done: 7098 done:
7025 up(&priv->action_sem); 7099 mutex_unlock(&priv->action_mutex);
7026 return err; 7100 return err;
7027} 7101}
7028 7102
@@ -7042,7 +7116,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev,
7042 return 0; 7116 return 0;
7043 } 7117 }
7044 7118
7045 down(&priv->action_sem); 7119 mutex_lock(&priv->action_mutex);
7046 if (!(priv->status & STATUS_INITIALIZED)) { 7120 if (!(priv->status & STATUS_INITIALIZED)) {
7047 err = -EIO; 7121 err = -EIO;
7048 goto done; 7122 goto done;
@@ -7074,7 +7148,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev,
7074 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); 7148 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
7075 7149
7076 done: 7150 done:
7077 up(&priv->action_sem); 7151 mutex_unlock(&priv->action_mutex);
7078 return err; 7152 return err;
7079} 7153}
7080 7154
@@ -7089,7 +7163,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev,
7089 if (wrqu->rts.fixed == 0) 7163 if (wrqu->rts.fixed == 0)
7090 return -EINVAL; 7164 return -EINVAL;
7091 7165
7092 down(&priv->action_sem); 7166 mutex_lock(&priv->action_mutex);
7093 if (!(priv->status & STATUS_INITIALIZED)) { 7167 if (!(priv->status & STATUS_INITIALIZED)) {
7094 err = -EIO; 7168 err = -EIO;
7095 goto done; 7169 goto done;
@@ -7109,7 +7183,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev,
7109 7183
7110 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value); 7184 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value);
7111 done: 7185 done:
7112 up(&priv->action_sem); 7186 mutex_unlock(&priv->action_mutex);
7113 return err; 7187 return err;
7114} 7188}
7115 7189
@@ -7160,7 +7234,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
7160 value = wrqu->txpower.value; 7234 value = wrqu->txpower.value;
7161 } 7235 }
7162 7236
7163 down(&priv->action_sem); 7237 mutex_lock(&priv->action_mutex);
7164 if (!(priv->status & STATUS_INITIALIZED)) { 7238 if (!(priv->status & STATUS_INITIALIZED)) {
7165 err = -EIO; 7239 err = -EIO;
7166 goto done; 7240 goto done;
@@ -7171,7 +7245,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
7171 IPW_DEBUG_WX("SET TX Power -> %d \n", value); 7245 IPW_DEBUG_WX("SET TX Power -> %d \n", value);
7172 7246
7173 done: 7247 done:
7174 up(&priv->action_sem); 7248 mutex_unlock(&priv->action_mutex);
7175 return err; 7249 return err;
7176} 7250}
7177 7251
@@ -7263,7 +7337,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev,
7263 if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) 7337 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7264 return 0; 7338 return 0;
7265 7339
7266 down(&priv->action_sem); 7340 mutex_lock(&priv->action_mutex);
7267 if (!(priv->status & STATUS_INITIALIZED)) { 7341 if (!(priv->status & STATUS_INITIALIZED)) {
7268 err = -EIO; 7342 err = -EIO;
7269 goto done; 7343 goto done;
@@ -7290,7 +7364,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev,
7290 IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value); 7364 IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value);
7291 7365
7292 done: 7366 done:
7293 up(&priv->action_sem); 7367 mutex_unlock(&priv->action_mutex);
7294 return err; 7368 return err;
7295} 7369}
7296 7370
@@ -7333,7 +7407,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev,
7333 struct ipw2100_priv *priv = ieee80211_priv(dev); 7407 struct ipw2100_priv *priv = ieee80211_priv(dev);
7334 int err = 0; 7408 int err = 0;
7335 7409
7336 down(&priv->action_sem); 7410 mutex_lock(&priv->action_mutex);
7337 if (!(priv->status & STATUS_INITIALIZED)) { 7411 if (!(priv->status & STATUS_INITIALIZED)) {
7338 err = -EIO; 7412 err = -EIO;
7339 goto done; 7413 goto done;
@@ -7348,7 +7422,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev,
7348 } 7422 }
7349 7423
7350 done: 7424 done:
7351 up(&priv->action_sem); 7425 mutex_unlock(&priv->action_mutex);
7352 return err; 7426 return err;
7353} 7427}
7354 7428
@@ -7398,7 +7472,7 @@ static int ipw2100_wx_set_power(struct net_device *dev,
7398 struct ipw2100_priv *priv = ieee80211_priv(dev); 7472 struct ipw2100_priv *priv = ieee80211_priv(dev);
7399 int err = 0; 7473 int err = 0;
7400 7474
7401 down(&priv->action_sem); 7475 mutex_lock(&priv->action_mutex);
7402 if (!(priv->status & STATUS_INITIALIZED)) { 7476 if (!(priv->status & STATUS_INITIALIZED)) {
7403 err = -EIO; 7477 err = -EIO;
7404 goto done; 7478 goto done;
@@ -7431,7 +7505,7 @@ static int ipw2100_wx_set_power(struct net_device *dev,
7431 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); 7505 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7432 7506
7433 done: 7507 done:
7434 up(&priv->action_sem); 7508 mutex_unlock(&priv->action_mutex);
7435 return err; 7509 return err;
7436 7510
7437} 7511}
@@ -7735,7 +7809,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev,
7735 int enable = (parms[0] > 0); 7809 int enable = (parms[0] > 0);
7736 int err = 0; 7810 int err = 0;
7737 7811
7738 down(&priv->action_sem); 7812 mutex_lock(&priv->action_mutex);
7739 if (!(priv->status & STATUS_INITIALIZED)) { 7813 if (!(priv->status & STATUS_INITIALIZED)) {
7740 err = -EIO; 7814 err = -EIO;
7741 goto done; 7815 goto done;
@@ -7753,7 +7827,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev,
7753 err = ipw2100_switch_mode(priv, priv->last_mode); 7827 err = ipw2100_switch_mode(priv, priv->last_mode);
7754 } 7828 }
7755 done: 7829 done:
7756 up(&priv->action_sem); 7830 mutex_unlock(&priv->action_mutex);
7757 return err; 7831 return err;
7758} 7832}
7759 7833
@@ -7776,7 +7850,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev,
7776 struct ipw2100_priv *priv = ieee80211_priv(dev); 7850 struct ipw2100_priv *priv = ieee80211_priv(dev);
7777 int err = 0, mode = *(int *)extra; 7851 int err = 0, mode = *(int *)extra;
7778 7852
7779 down(&priv->action_sem); 7853 mutex_lock(&priv->action_mutex);
7780 if (!(priv->status & STATUS_INITIALIZED)) { 7854 if (!(priv->status & STATUS_INITIALIZED)) {
7781 err = -EIO; 7855 err = -EIO;
7782 goto done; 7856 goto done;
@@ -7788,7 +7862,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev,
7788 if (priv->power_mode != mode) 7862 if (priv->power_mode != mode)
7789 err = ipw2100_set_power_mode(priv, mode); 7863 err = ipw2100_set_power_mode(priv, mode);
7790 done: 7864 done:
7791 up(&priv->action_sem); 7865 mutex_unlock(&priv->action_mutex);
7792 return err; 7866 return err;
7793} 7867}
7794 7868
@@ -7840,7 +7914,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev,
7840 struct ipw2100_priv *priv = ieee80211_priv(dev); 7914 struct ipw2100_priv *priv = ieee80211_priv(dev);
7841 int err, mode = *(int *)extra; 7915 int err, mode = *(int *)extra;
7842 7916
7843 down(&priv->action_sem); 7917 mutex_lock(&priv->action_mutex);
7844 if (!(priv->status & STATUS_INITIALIZED)) { 7918 if (!(priv->status & STATUS_INITIALIZED)) {
7845 err = -EIO; 7919 err = -EIO;
7846 goto done; 7920 goto done;
@@ -7858,7 +7932,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev,
7858 err = ipw2100_system_config(priv, 0); 7932 err = ipw2100_system_config(priv, 0);
7859 7933
7860 done: 7934 done:
7861 up(&priv->action_sem); 7935 mutex_unlock(&priv->action_mutex);
7862 return err; 7936 return err;
7863} 7937}
7864 7938
@@ -7888,7 +7962,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev,
7888 struct ipw2100_priv *priv = ieee80211_priv(dev); 7962 struct ipw2100_priv *priv = ieee80211_priv(dev);
7889 int err, mode = *(int *)extra; 7963 int err, mode = *(int *)extra;
7890 7964
7891 down(&priv->action_sem); 7965 mutex_lock(&priv->action_mutex);
7892 if (!(priv->status & STATUS_INITIALIZED)) { 7966 if (!(priv->status & STATUS_INITIALIZED)) {
7893 err = -EIO; 7967 err = -EIO;
7894 goto done; 7968 goto done;
@@ -7905,7 +7979,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev,
7905 err = 0; 7979 err = 0;
7906 7980
7907 done: 7981 done:
7908 up(&priv->action_sem); 7982 mutex_unlock(&priv->action_mutex);
7909 return err; 7983 return err;
7910} 7984}
7911 7985
@@ -8210,11 +8284,11 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8210 if (priv->status & STATUS_STOPPING) 8284 if (priv->status & STATUS_STOPPING)
8211 return; 8285 return;
8212 8286
8213 down(&priv->action_sem); 8287 mutex_lock(&priv->action_mutex);
8214 8288
8215 IPW_DEBUG_WX("enter\n"); 8289 IPW_DEBUG_WX("enter\n");
8216 8290
8217 up(&priv->action_sem); 8291 mutex_unlock(&priv->action_mutex);
8218 8292
8219 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 8293 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8220 8294
@@ -8237,7 +8311,7 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8237 8311
8238 if (!(priv->status & STATUS_ASSOCIATED)) { 8312 if (!(priv->status & STATUS_ASSOCIATED)) {
8239 IPW_DEBUG_WX("Configuring ESSID\n"); 8313 IPW_DEBUG_WX("Configuring ESSID\n");
8240 down(&priv->action_sem); 8314 mutex_lock(&priv->action_mutex);
8241 /* This is a disassociation event, so kick the firmware to 8315 /* This is a disassociation event, so kick the firmware to
8242 * look for another AP */ 8316 * look for another AP */
8243 if (priv->config & CFG_STATIC_ESSID) 8317 if (priv->config & CFG_STATIC_ESSID)
@@ -8245,7 +8319,7 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8245 0); 8319 0);
8246 else 8320 else
8247 ipw2100_set_essid(priv, NULL, 0, 0); 8321 ipw2100_set_essid(priv, NULL, 0, 0);
8248 up(&priv->action_sem); 8322 mutex_unlock(&priv->action_mutex);
8249 } 8323 }
8250 8324
8251 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); 8325 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);