diff options
Diffstat (limited to 'drivers/net/wireless/ipw2100.c')
-rw-r--r-- | drivers/net/wireless/ipw2100.c | 266 |
1 files changed, 183 insertions, 83 deletions
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index 6290c9f7e939..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 "1.1.3" | 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 | ||
@@ -1672,6 +1672,18 @@ static int ipw2100_start_scan(struct ipw2100_priv *priv) | |||
1672 | return err; | 1672 | return err; |
1673 | } | 1673 | } |
1674 | 1674 | ||
1675 | static const struct ieee80211_geo ipw_geos[] = { | ||
1676 | { /* Restricted */ | ||
1677 | "---", | ||
1678 | .bg_channels = 14, | ||
1679 | .bg = {{2412, 1}, {2417, 2}, {2422, 3}, | ||
1680 | {2427, 4}, {2432, 5}, {2437, 6}, | ||
1681 | {2442, 7}, {2447, 8}, {2452, 9}, | ||
1682 | {2457, 10}, {2462, 11}, {2467, 12}, | ||
1683 | {2472, 13}, {2484, 14}}, | ||
1684 | }, | ||
1685 | }; | ||
1686 | |||
1675 | static int ipw2100_up(struct ipw2100_priv *priv, int deferred) | 1687 | static int ipw2100_up(struct ipw2100_priv *priv, int deferred) |
1676 | { | 1688 | { |
1677 | unsigned long flags; | 1689 | unsigned long flags; |
@@ -1727,6 +1739,13 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) | |||
1727 | goto exit; | 1739 | goto exit; |
1728 | } | 1740 | } |
1729 | 1741 | ||
1742 | /* Initialize the geo */ | ||
1743 | if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) { | ||
1744 | printk(KERN_WARNING DRV_NAME "Could not set geo\n"); | ||
1745 | return 0; | ||
1746 | } | ||
1747 | priv->ieee->freq_band = IEEE80211_24GHZ_BAND; | ||
1748 | |||
1730 | lock = LOCK_NONE; | 1749 | lock = LOCK_NONE; |
1731 | if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { | 1750 | if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) { |
1732 | printk(KERN_ERR DRV_NAME | 1751 | printk(KERN_ERR DRV_NAME |
@@ -1869,7 +1888,7 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv) | |||
1869 | priv->status |= STATUS_RESET_PENDING; | 1888 | priv->status |= STATUS_RESET_PENDING; |
1870 | spin_unlock_irqrestore(&priv->low_lock, flags); | 1889 | spin_unlock_irqrestore(&priv->low_lock, flags); |
1871 | 1890 | ||
1872 | down(&priv->action_sem); | 1891 | mutex_lock(&priv->action_mutex); |
1873 | /* stop timed checks so that they don't interfere with reset */ | 1892 | /* stop timed checks so that they don't interfere with reset */ |
1874 | priv->stop_hang_check = 1; | 1893 | priv->stop_hang_check = 1; |
1875 | cancel_delayed_work(&priv->hang_check); | 1894 | cancel_delayed_work(&priv->hang_check); |
@@ -1879,7 +1898,7 @@ static void ipw2100_reset_adapter(struct ipw2100_priv *priv) | |||
1879 | wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); | 1898 | wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); |
1880 | 1899 | ||
1881 | ipw2100_up(priv, 0); | 1900 | ipw2100_up(priv, 0); |
1882 | up(&priv->action_sem); | 1901 | mutex_unlock(&priv->action_mutex); |
1883 | 1902 | ||
1884 | } | 1903 | } |
1885 | 1904 | ||
@@ -2371,15 +2390,6 @@ static void isr_rx(struct ipw2100_priv *priv, int i, | |||
2371 | IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); | 2390 | IPW_DEBUG_DROP("Dropping packet while interface is not up.\n"); |
2372 | return; | 2391 | return; |
2373 | } | 2392 | } |
2374 | #ifdef CONFIG_IPW2100_MONITOR | ||
2375 | if (unlikely(priv->ieee->iw_mode == IW_MODE_MONITOR && | ||
2376 | priv->config & CFG_CRC_CHECK && | ||
2377 | status->flags & IPW_STATUS_FLAG_CRC_ERROR)) { | ||
2378 | IPW_DEBUG_RX("CRC error in packet. Dropping.\n"); | ||
2379 | priv->ieee->stats.rx_errors++; | ||
2380 | return; | ||
2381 | } | ||
2382 | #endif | ||
2383 | 2393 | ||
2384 | if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && | 2394 | if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR && |
2385 | !(priv->status & STATUS_ASSOCIATED))) { | 2395 | !(priv->status & STATUS_ASSOCIATED))) { |
@@ -2427,6 +2437,89 @@ static void isr_rx(struct ipw2100_priv *priv, int i, | |||
2427 | priv->rx_queue.drv[i].host_addr = packet->dma_addr; | 2437 | priv->rx_queue.drv[i].host_addr = packet->dma_addr; |
2428 | } | 2438 | } |
2429 | 2439 | ||
2440 | #ifdef CONFIG_IPW2100_MONITOR | ||
2441 | |||
2442 | static 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 | |||
2430 | static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i) | 2523 | static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i) |
2431 | { | 2524 | { |
2432 | struct ipw2100_status *status = &priv->status_queue.drv[i]; | 2525 | struct ipw2100_status *status = &priv->status_queue.drv[i]; |
@@ -2558,7 +2651,7 @@ static void __ipw2100_rx_process(struct ipw2100_priv *priv) | |||
2558 | case P8023_DATA_VAL: | 2651 | case P8023_DATA_VAL: |
2559 | #ifdef CONFIG_IPW2100_MONITOR | 2652 | #ifdef CONFIG_IPW2100_MONITOR |
2560 | if (priv->ieee->iw_mode == IW_MODE_MONITOR) { | 2653 | if (priv->ieee->iw_mode == IW_MODE_MONITOR) { |
2561 | isr_rx(priv, i, &stats); | 2654 | isr_rx_monitor(priv, i, &stats); |
2562 | break; | 2655 | break; |
2563 | } | 2656 | } |
2564 | #endif | 2657 | #endif |
@@ -3750,7 +3843,7 @@ static ssize_t store_memory(struct device *d, struct device_attribute *attr, | |||
3750 | struct net_device *dev = priv->net_dev; | 3843 | struct net_device *dev = priv->net_dev; |
3751 | const char *p = buf; | 3844 | const char *p = buf; |
3752 | 3845 | ||
3753 | (void) dev; /* kill unused-var warning for debug-only code */ | 3846 | (void)dev; /* kill unused-var warning for debug-only code */ |
3754 | 3847 | ||
3755 | if (count < 1) | 3848 | if (count < 1) |
3756 | return count; | 3849 | return count; |
@@ -3863,7 +3956,7 @@ static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode) | |||
3863 | #ifdef CONFIG_IPW2100_MONITOR | 3956 | #ifdef CONFIG_IPW2100_MONITOR |
3864 | case IW_MODE_MONITOR: | 3957 | case IW_MODE_MONITOR: |
3865 | priv->last_mode = priv->ieee->iw_mode; | 3958 | priv->last_mode = priv->ieee->iw_mode; |
3866 | priv->net_dev->type = ARPHRD_IEEE80211; | 3959 | priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP; |
3867 | break; | 3960 | break; |
3868 | #endif /* CONFIG_IPW2100_MONITOR */ | 3961 | #endif /* CONFIG_IPW2100_MONITOR */ |
3869 | } | 3962 | } |
@@ -4070,7 +4163,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr, | |||
4070 | unsigned long val; | 4163 | unsigned long val; |
4071 | char *p = buffer; | 4164 | char *p = buffer; |
4072 | 4165 | ||
4073 | (void) dev; /* kill unused-var warning for debug-only code */ | 4166 | (void)dev; /* kill unused-var warning for debug-only code */ |
4074 | 4167 | ||
4075 | IPW_DEBUG_INFO("enter\n"); | 4168 | IPW_DEBUG_INFO("enter\n"); |
4076 | 4169 | ||
@@ -4119,7 +4212,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio) | |||
4119 | 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", |
4120 | disable_radio ? "OFF" : "ON"); | 4213 | disable_radio ? "OFF" : "ON"); |
4121 | 4214 | ||
4122 | down(&priv->action_sem); | 4215 | mutex_lock(&priv->action_mutex); |
4123 | 4216 | ||
4124 | if (disable_radio) { | 4217 | if (disable_radio) { |
4125 | priv->status |= STATUS_RF_KILL_SW; | 4218 | priv->status |= STATUS_RF_KILL_SW; |
@@ -4137,7 +4230,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio) | |||
4137 | schedule_reset(priv); | 4230 | schedule_reset(priv); |
4138 | } | 4231 | } |
4139 | 4232 | ||
4140 | up(&priv->action_sem); | 4233 | mutex_unlock(&priv->action_mutex); |
4141 | return 1; | 4234 | return 1; |
4142 | } | 4235 | } |
4143 | 4236 | ||
@@ -5107,12 +5200,13 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power) | |||
5107 | .host_command_length = 4 | 5200 | .host_command_length = 4 |
5108 | }; | 5201 | }; |
5109 | int err = 0; | 5202 | int err = 0; |
5203 | u32 tmp = tx_power; | ||
5110 | 5204 | ||
5111 | if (tx_power != IPW_TX_POWER_DEFAULT) | 5205 | if (tx_power != IPW_TX_POWER_DEFAULT) |
5112 | tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / | 5206 | tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / |
5113 | (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); | 5207 | (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); |
5114 | 5208 | ||
5115 | cmd.host_command_parameters[0] = tx_power; | 5209 | cmd.host_command_parameters[0] = tmp; |
5116 | 5210 | ||
5117 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) | 5211 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) |
5118 | err = ipw2100_hw_send_command(priv, &cmd); | 5212 | err = ipw2100_hw_send_command(priv, &cmd); |
@@ -5365,9 +5459,12 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode) | |||
5365 | SEC_LEVEL_0, 0, 1); | 5459 | SEC_LEVEL_0, 0, 1); |
5366 | } else { | 5460 | } else { |
5367 | auth_mode = IPW_AUTH_OPEN; | 5461 | auth_mode = IPW_AUTH_OPEN; |
5368 | if ((priv->ieee->sec.flags & SEC_AUTH_MODE) && | 5462 | if (priv->ieee->sec.flags & SEC_AUTH_MODE) { |
5369 | (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) | 5463 | if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) |
5370 | auth_mode = IPW_AUTH_SHARED; | 5464 | auth_mode = IPW_AUTH_SHARED; |
5465 | else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) | ||
5466 | auth_mode = IPW_AUTH_LEAP_CISCO_ID; | ||
5467 | } | ||
5371 | 5468 | ||
5372 | sec_level = SEC_LEVEL_0; | 5469 | sec_level = SEC_LEVEL_0; |
5373 | if (priv->ieee->sec.flags & SEC_LEVEL) | 5470 | if (priv->ieee->sec.flags & SEC_LEVEL) |
@@ -5437,7 +5534,7 @@ static void shim__set_security(struct net_device *dev, | |||
5437 | struct ipw2100_priv *priv = ieee80211_priv(dev); | 5534 | struct ipw2100_priv *priv = ieee80211_priv(dev); |
5438 | int i, force_update = 0; | 5535 | int i, force_update = 0; |
5439 | 5536 | ||
5440 | down(&priv->action_sem); | 5537 | mutex_lock(&priv->action_mutex); |
5441 | if (!(priv->status & STATUS_INITIALIZED)) | 5538 | if (!(priv->status & STATUS_INITIALIZED)) |
5442 | goto done; | 5539 | goto done; |
5443 | 5540 | ||
@@ -5510,7 +5607,7 @@ static void shim__set_security(struct net_device *dev, | |||
5510 | if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) | 5607 | if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) |
5511 | ipw2100_configure_security(priv, 0); | 5608 | ipw2100_configure_security(priv, 0); |
5512 | done: | 5609 | done: |
5513 | up(&priv->action_sem); | 5610 | mutex_unlock(&priv->action_mutex); |
5514 | } | 5611 | } |
5515 | 5612 | ||
5516 | static int ipw2100_adapter_setup(struct ipw2100_priv *priv) | 5613 | static int ipw2100_adapter_setup(struct ipw2100_priv *priv) |
@@ -5634,7 +5731,7 @@ static int ipw2100_set_address(struct net_device *dev, void *p) | |||
5634 | if (!is_valid_ether_addr(addr->sa_data)) | 5731 | if (!is_valid_ether_addr(addr->sa_data)) |
5635 | return -EADDRNOTAVAIL; | 5732 | return -EADDRNOTAVAIL; |
5636 | 5733 | ||
5637 | down(&priv->action_sem); | 5734 | mutex_lock(&priv->action_mutex); |
5638 | 5735 | ||
5639 | priv->config |= CFG_CUSTOM_MAC; | 5736 | priv->config |= CFG_CUSTOM_MAC; |
5640 | memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); | 5737 | memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); |
@@ -5644,12 +5741,12 @@ static int ipw2100_set_address(struct net_device *dev, void *p) | |||
5644 | goto done; | 5741 | goto done; |
5645 | 5742 | ||
5646 | priv->reset_backoff = 0; | 5743 | priv->reset_backoff = 0; |
5647 | up(&priv->action_sem); | 5744 | mutex_unlock(&priv->action_mutex); |
5648 | ipw2100_reset_adapter(priv); | 5745 | ipw2100_reset_adapter(priv); |
5649 | return 0; | 5746 | return 0; |
5650 | 5747 | ||
5651 | done: | 5748 | done: |
5652 | up(&priv->action_sem); | 5749 | mutex_unlock(&priv->action_mutex); |
5653 | return err; | 5750 | return err; |
5654 | } | 5751 | } |
5655 | 5752 | ||
@@ -5760,6 +5857,9 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) | |||
5760 | } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { | 5857 | } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { |
5761 | sec.auth_mode = WLAN_AUTH_OPEN; | 5858 | sec.auth_mode = WLAN_AUTH_OPEN; |
5762 | ieee->open_wep = 1; | 5859 | ieee->open_wep = 1; |
5860 | } else if (value & IW_AUTH_ALG_LEAP) { | ||
5861 | sec.auth_mode = WLAN_AUTH_LEAP; | ||
5862 | ieee->open_wep = 1; | ||
5763 | } else | 5863 | } else |
5764 | return -EINVAL; | 5864 | return -EINVAL; |
5765 | 5865 | ||
@@ -5771,8 +5871,8 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) | |||
5771 | return ret; | 5871 | return ret; |
5772 | } | 5872 | } |
5773 | 5873 | ||
5774 | void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, | 5874 | static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, |
5775 | char *wpa_ie, int wpa_ie_len) | 5875 | char *wpa_ie, int wpa_ie_len) |
5776 | { | 5876 | { |
5777 | 5877 | ||
5778 | struct ipw2100_wpa_assoc_frame frame; | 5878 | struct ipw2100_wpa_assoc_frame frame; |
@@ -5989,8 +6089,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, | |||
5989 | strcpy(priv->nick, "ipw2100"); | 6089 | strcpy(priv->nick, "ipw2100"); |
5990 | 6090 | ||
5991 | spin_lock_init(&priv->low_lock); | 6091 | spin_lock_init(&priv->low_lock); |
5992 | sema_init(&priv->action_sem, 1); | 6092 | mutex_init(&priv->action_mutex); |
5993 | sema_init(&priv->adapter_sem, 1); | 6093 | mutex_init(&priv->adapter_mutex); |
5994 | 6094 | ||
5995 | init_waitqueue_head(&priv->wait_command_queue); | 6095 | init_waitqueue_head(&priv->wait_command_queue); |
5996 | 6096 | ||
@@ -6155,7 +6255,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
6155 | * 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. |
6156 | * net_dev->init is called after name allocation but before the | 6256 | * net_dev->init is called after name allocation but before the |
6157 | * notifier chain is called */ | 6257 | * notifier chain is called */ |
6158 | down(&priv->action_sem); | 6258 | mutex_lock(&priv->action_mutex); |
6159 | err = register_netdev(dev); | 6259 | err = register_netdev(dev); |
6160 | if (err) { | 6260 | if (err) { |
6161 | printk(KERN_WARNING DRV_NAME | 6261 | printk(KERN_WARNING DRV_NAME |
@@ -6191,12 +6291,12 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
6191 | 6291 | ||
6192 | priv->status |= STATUS_INITIALIZED; | 6292 | priv->status |= STATUS_INITIALIZED; |
6193 | 6293 | ||
6194 | up(&priv->action_sem); | 6294 | mutex_unlock(&priv->action_mutex); |
6195 | 6295 | ||
6196 | return 0; | 6296 | return 0; |
6197 | 6297 | ||
6198 | fail_unlock: | 6298 | fail_unlock: |
6199 | up(&priv->action_sem); | 6299 | mutex_unlock(&priv->action_mutex); |
6200 | 6300 | ||
6201 | fail: | 6301 | fail: |
6202 | if (dev) { | 6302 | if (dev) { |
@@ -6236,7 +6336,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) | |||
6236 | struct net_device *dev; | 6336 | struct net_device *dev; |
6237 | 6337 | ||
6238 | if (priv) { | 6338 | if (priv) { |
6239 | down(&priv->action_sem); | 6339 | mutex_lock(&priv->action_mutex); |
6240 | 6340 | ||
6241 | priv->status &= ~STATUS_INITIALIZED; | 6341 | priv->status &= ~STATUS_INITIALIZED; |
6242 | 6342 | ||
@@ -6251,9 +6351,9 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) | |||
6251 | /* Take down the hardware */ | 6351 | /* Take down the hardware */ |
6252 | ipw2100_down(priv); | 6352 | ipw2100_down(priv); |
6253 | 6353 | ||
6254 | /* Release the semaphore so that the network subsystem can | 6354 | /* Release the mutex so that the network subsystem can |
6255 | * complete any needed calls into the driver... */ | 6355 | * complete any needed calls into the driver... */ |
6256 | up(&priv->action_sem); | 6356 | mutex_unlock(&priv->action_mutex); |
6257 | 6357 | ||
6258 | /* Unregister the device first - this results in close() | 6358 | /* Unregister the device first - this results in close() |
6259 | * being called if the device is open. If we free storage | 6359 | * being called if the device is open. If we free storage |
@@ -6292,7 +6392,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state) | |||
6292 | 6392 | ||
6293 | IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); | 6393 | IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name); |
6294 | 6394 | ||
6295 | down(&priv->action_sem); | 6395 | mutex_lock(&priv->action_mutex); |
6296 | if (priv->status & STATUS_INITIALIZED) { | 6396 | if (priv->status & STATUS_INITIALIZED) { |
6297 | /* Take down the device; powers it off, etc. */ | 6397 | /* Take down the device; powers it off, etc. */ |
6298 | ipw2100_down(priv); | 6398 | ipw2100_down(priv); |
@@ -6305,7 +6405,7 @@ static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state) | |||
6305 | pci_disable_device(pci_dev); | 6405 | pci_disable_device(pci_dev); |
6306 | pci_set_power_state(pci_dev, PCI_D3hot); | 6406 | pci_set_power_state(pci_dev, PCI_D3hot); |
6307 | 6407 | ||
6308 | up(&priv->action_sem); | 6408 | mutex_unlock(&priv->action_mutex); |
6309 | 6409 | ||
6310 | return 0; | 6410 | return 0; |
6311 | } | 6411 | } |
@@ -6319,7 +6419,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev) | |||
6319 | if (IPW2100_PM_DISABLED) | 6419 | if (IPW2100_PM_DISABLED) |
6320 | return 0; | 6420 | return 0; |
6321 | 6421 | ||
6322 | down(&priv->action_sem); | 6422 | mutex_lock(&priv->action_mutex); |
6323 | 6423 | ||
6324 | IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); | 6424 | IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name); |
6325 | 6425 | ||
@@ -6345,7 +6445,7 @@ static int ipw2100_resume(struct pci_dev *pci_dev) | |||
6345 | if (!(priv->status & STATUS_RF_KILL_SW)) | 6445 | if (!(priv->status & STATUS_RF_KILL_SW)) |
6346 | ipw2100_up(priv, 0); | 6446 | ipw2100_up(priv, 0); |
6347 | 6447 | ||
6348 | up(&priv->action_sem); | 6448 | mutex_unlock(&priv->action_mutex); |
6349 | 6449 | ||
6350 | return 0; | 6450 | return 0; |
6351 | } | 6451 | } |
@@ -6509,7 +6609,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev, | |||
6509 | if (priv->ieee->iw_mode == IW_MODE_INFRA) | 6609 | if (priv->ieee->iw_mode == IW_MODE_INFRA) |
6510 | return -EOPNOTSUPP; | 6610 | return -EOPNOTSUPP; |
6511 | 6611 | ||
6512 | down(&priv->action_sem); | 6612 | mutex_lock(&priv->action_mutex); |
6513 | if (!(priv->status & STATUS_INITIALIZED)) { | 6613 | if (!(priv->status & STATUS_INITIALIZED)) { |
6514 | err = -EIO; | 6614 | err = -EIO; |
6515 | goto done; | 6615 | goto done; |
@@ -6540,7 +6640,7 @@ static int ipw2100_wx_set_freq(struct net_device *dev, | |||
6540 | } | 6640 | } |
6541 | 6641 | ||
6542 | done: | 6642 | done: |
6543 | up(&priv->action_sem); | 6643 | mutex_unlock(&priv->action_mutex); |
6544 | return err; | 6644 | return err; |
6545 | } | 6645 | } |
6546 | 6646 | ||
@@ -6581,7 +6681,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev, | |||
6581 | if (wrqu->mode == priv->ieee->iw_mode) | 6681 | if (wrqu->mode == priv->ieee->iw_mode) |
6582 | return 0; | 6682 | return 0; |
6583 | 6683 | ||
6584 | down(&priv->action_sem); | 6684 | mutex_lock(&priv->action_mutex); |
6585 | if (!(priv->status & STATUS_INITIALIZED)) { | 6685 | if (!(priv->status & STATUS_INITIALIZED)) { |
6586 | err = -EIO; | 6686 | err = -EIO; |
6587 | goto done; | 6687 | goto done; |
@@ -6604,7 +6704,7 @@ static int ipw2100_wx_set_mode(struct net_device *dev, | |||
6604 | } | 6704 | } |
6605 | 6705 | ||
6606 | done: | 6706 | done: |
6607 | up(&priv->action_sem); | 6707 | mutex_unlock(&priv->action_mutex); |
6608 | return err; | 6708 | return err; |
6609 | } | 6709 | } |
6610 | 6710 | ||
@@ -6786,7 +6886,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev, | |||
6786 | if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) | 6886 | if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) |
6787 | return -EINVAL; | 6887 | return -EINVAL; |
6788 | 6888 | ||
6789 | down(&priv->action_sem); | 6889 | mutex_lock(&priv->action_mutex); |
6790 | if (!(priv->status & STATUS_INITIALIZED)) { | 6890 | if (!(priv->status & STATUS_INITIALIZED)) { |
6791 | err = -EIO; | 6891 | err = -EIO; |
6792 | goto done; | 6892 | goto done; |
@@ -6815,7 +6915,7 @@ static int ipw2100_wx_set_wap(struct net_device *dev, | |||
6815 | wrqu->ap_addr.sa_data[5] & 0xff); | 6915 | wrqu->ap_addr.sa_data[5] & 0xff); |
6816 | 6916 | ||
6817 | done: | 6917 | done: |
6818 | up(&priv->action_sem); | 6918 | mutex_unlock(&priv->action_mutex); |
6819 | return err; | 6919 | return err; |
6820 | } | 6920 | } |
6821 | 6921 | ||
@@ -6851,7 +6951,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev, | |||
6851 | int length = 0; | 6951 | int length = 0; |
6852 | int err = 0; | 6952 | int err = 0; |
6853 | 6953 | ||
6854 | down(&priv->action_sem); | 6954 | mutex_lock(&priv->action_mutex); |
6855 | if (!(priv->status & STATUS_INITIALIZED)) { | 6955 | if (!(priv->status & STATUS_INITIALIZED)) { |
6856 | err = -EIO; | 6956 | err = -EIO; |
6857 | goto done; | 6957 | goto done; |
@@ -6888,7 +6988,7 @@ static int ipw2100_wx_set_essid(struct net_device *dev, | |||
6888 | err = ipw2100_set_essid(priv, essid, length, 0); | 6988 | err = ipw2100_set_essid(priv, essid, length, 0); |
6889 | 6989 | ||
6890 | done: | 6990 | done: |
6891 | up(&priv->action_sem); | 6991 | mutex_unlock(&priv->action_mutex); |
6892 | return err; | 6992 | return err; |
6893 | } | 6993 | } |
6894 | 6994 | ||
@@ -6969,7 +7069,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev, | |||
6969 | u32 rate; | 7069 | u32 rate; |
6970 | int err = 0; | 7070 | int err = 0; |
6971 | 7071 | ||
6972 | down(&priv->action_sem); | 7072 | mutex_lock(&priv->action_mutex); |
6973 | if (!(priv->status & STATUS_INITIALIZED)) { | 7073 | if (!(priv->status & STATUS_INITIALIZED)) { |
6974 | err = -EIO; | 7074 | err = -EIO; |
6975 | goto done; | 7075 | goto done; |
@@ -6996,7 +7096,7 @@ static int ipw2100_wx_set_rate(struct net_device *dev, | |||
6996 | 7096 | ||
6997 | IPW_DEBUG_WX("SET Rate -> %04X \n", rate); | 7097 | IPW_DEBUG_WX("SET Rate -> %04X \n", rate); |
6998 | done: | 7098 | done: |
6999 | up(&priv->action_sem); | 7099 | mutex_unlock(&priv->action_mutex); |
7000 | return err; | 7100 | return err; |
7001 | } | 7101 | } |
7002 | 7102 | ||
@@ -7016,7 +7116,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev, | |||
7016 | return 0; | 7116 | return 0; |
7017 | } | 7117 | } |
7018 | 7118 | ||
7019 | down(&priv->action_sem); | 7119 | mutex_lock(&priv->action_mutex); |
7020 | if (!(priv->status & STATUS_INITIALIZED)) { | 7120 | if (!(priv->status & STATUS_INITIALIZED)) { |
7021 | err = -EIO; | 7121 | err = -EIO; |
7022 | goto done; | 7122 | goto done; |
@@ -7048,7 +7148,7 @@ static int ipw2100_wx_get_rate(struct net_device *dev, | |||
7048 | IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); | 7148 | IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); |
7049 | 7149 | ||
7050 | done: | 7150 | done: |
7051 | up(&priv->action_sem); | 7151 | mutex_unlock(&priv->action_mutex); |
7052 | return err; | 7152 | return err; |
7053 | } | 7153 | } |
7054 | 7154 | ||
@@ -7063,7 +7163,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev, | |||
7063 | if (wrqu->rts.fixed == 0) | 7163 | if (wrqu->rts.fixed == 0) |
7064 | return -EINVAL; | 7164 | return -EINVAL; |
7065 | 7165 | ||
7066 | down(&priv->action_sem); | 7166 | mutex_lock(&priv->action_mutex); |
7067 | if (!(priv->status & STATUS_INITIALIZED)) { | 7167 | if (!(priv->status & STATUS_INITIALIZED)) { |
7068 | err = -EIO; | 7168 | err = -EIO; |
7069 | goto done; | 7169 | goto done; |
@@ -7083,7 +7183,7 @@ static int ipw2100_wx_set_rts(struct net_device *dev, | |||
7083 | 7183 | ||
7084 | IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value); | 7184 | IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value); |
7085 | done: | 7185 | done: |
7086 | up(&priv->action_sem); | 7186 | mutex_unlock(&priv->action_mutex); |
7087 | return err; | 7187 | return err; |
7088 | } | 7188 | } |
7089 | 7189 | ||
@@ -7134,7 +7234,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev, | |||
7134 | value = wrqu->txpower.value; | 7234 | value = wrqu->txpower.value; |
7135 | } | 7235 | } |
7136 | 7236 | ||
7137 | down(&priv->action_sem); | 7237 | mutex_lock(&priv->action_mutex); |
7138 | if (!(priv->status & STATUS_INITIALIZED)) { | 7238 | if (!(priv->status & STATUS_INITIALIZED)) { |
7139 | err = -EIO; | 7239 | err = -EIO; |
7140 | goto done; | 7240 | goto done; |
@@ -7145,7 +7245,7 @@ static int ipw2100_wx_set_txpow(struct net_device *dev, | |||
7145 | IPW_DEBUG_WX("SET TX Power -> %d \n", value); | 7245 | IPW_DEBUG_WX("SET TX Power -> %d \n", value); |
7146 | 7246 | ||
7147 | done: | 7247 | done: |
7148 | up(&priv->action_sem); | 7248 | mutex_unlock(&priv->action_mutex); |
7149 | return err; | 7249 | return err; |
7150 | } | 7250 | } |
7151 | 7251 | ||
@@ -7237,7 +7337,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev, | |||
7237 | if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) | 7337 | if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) |
7238 | return 0; | 7338 | return 0; |
7239 | 7339 | ||
7240 | down(&priv->action_sem); | 7340 | mutex_lock(&priv->action_mutex); |
7241 | if (!(priv->status & STATUS_INITIALIZED)) { | 7341 | if (!(priv->status & STATUS_INITIALIZED)) { |
7242 | err = -EIO; | 7342 | err = -EIO; |
7243 | goto done; | 7343 | goto done; |
@@ -7264,7 +7364,7 @@ static int ipw2100_wx_set_retry(struct net_device *dev, | |||
7264 | 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); |
7265 | 7365 | ||
7266 | done: | 7366 | done: |
7267 | up(&priv->action_sem); | 7367 | mutex_unlock(&priv->action_mutex); |
7268 | return err; | 7368 | return err; |
7269 | } | 7369 | } |
7270 | 7370 | ||
@@ -7307,7 +7407,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev, | |||
7307 | struct ipw2100_priv *priv = ieee80211_priv(dev); | 7407 | struct ipw2100_priv *priv = ieee80211_priv(dev); |
7308 | int err = 0; | 7408 | int err = 0; |
7309 | 7409 | ||
7310 | down(&priv->action_sem); | 7410 | mutex_lock(&priv->action_mutex); |
7311 | if (!(priv->status & STATUS_INITIALIZED)) { | 7411 | if (!(priv->status & STATUS_INITIALIZED)) { |
7312 | err = -EIO; | 7412 | err = -EIO; |
7313 | goto done; | 7413 | goto done; |
@@ -7322,7 +7422,7 @@ static int ipw2100_wx_set_scan(struct net_device *dev, | |||
7322 | } | 7422 | } |
7323 | 7423 | ||
7324 | done: | 7424 | done: |
7325 | up(&priv->action_sem); | 7425 | mutex_unlock(&priv->action_mutex); |
7326 | return err; | 7426 | return err; |
7327 | } | 7427 | } |
7328 | 7428 | ||
@@ -7372,7 +7472,7 @@ static int ipw2100_wx_set_power(struct net_device *dev, | |||
7372 | struct ipw2100_priv *priv = ieee80211_priv(dev); | 7472 | struct ipw2100_priv *priv = ieee80211_priv(dev); |
7373 | int err = 0; | 7473 | int err = 0; |
7374 | 7474 | ||
7375 | down(&priv->action_sem); | 7475 | mutex_lock(&priv->action_mutex); |
7376 | if (!(priv->status & STATUS_INITIALIZED)) { | 7476 | if (!(priv->status & STATUS_INITIALIZED)) { |
7377 | err = -EIO; | 7477 | err = -EIO; |
7378 | goto done; | 7478 | goto done; |
@@ -7405,7 +7505,7 @@ static int ipw2100_wx_set_power(struct net_device *dev, | |||
7405 | 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); |
7406 | 7506 | ||
7407 | done: | 7507 | done: |
7408 | up(&priv->action_sem); | 7508 | mutex_unlock(&priv->action_mutex); |
7409 | return err; | 7509 | return err; |
7410 | 7510 | ||
7411 | } | 7511 | } |
@@ -7709,7 +7809,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev, | |||
7709 | int enable = (parms[0] > 0); | 7809 | int enable = (parms[0] > 0); |
7710 | int err = 0; | 7810 | int err = 0; |
7711 | 7811 | ||
7712 | down(&priv->action_sem); | 7812 | mutex_lock(&priv->action_mutex); |
7713 | if (!(priv->status & STATUS_INITIALIZED)) { | 7813 | if (!(priv->status & STATUS_INITIALIZED)) { |
7714 | err = -EIO; | 7814 | err = -EIO; |
7715 | goto done; | 7815 | goto done; |
@@ -7727,7 +7827,7 @@ static int ipw2100_wx_set_promisc(struct net_device *dev, | |||
7727 | err = ipw2100_switch_mode(priv, priv->last_mode); | 7827 | err = ipw2100_switch_mode(priv, priv->last_mode); |
7728 | } | 7828 | } |
7729 | done: | 7829 | done: |
7730 | up(&priv->action_sem); | 7830 | mutex_unlock(&priv->action_mutex); |
7731 | return err; | 7831 | return err; |
7732 | } | 7832 | } |
7733 | 7833 | ||
@@ -7750,7 +7850,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev, | |||
7750 | struct ipw2100_priv *priv = ieee80211_priv(dev); | 7850 | struct ipw2100_priv *priv = ieee80211_priv(dev); |
7751 | int err = 0, mode = *(int *)extra; | 7851 | int err = 0, mode = *(int *)extra; |
7752 | 7852 | ||
7753 | down(&priv->action_sem); | 7853 | mutex_lock(&priv->action_mutex); |
7754 | if (!(priv->status & STATUS_INITIALIZED)) { | 7854 | if (!(priv->status & STATUS_INITIALIZED)) { |
7755 | err = -EIO; | 7855 | err = -EIO; |
7756 | goto done; | 7856 | goto done; |
@@ -7762,7 +7862,7 @@ static int ipw2100_wx_set_powermode(struct net_device *dev, | |||
7762 | if (priv->power_mode != mode) | 7862 | if (priv->power_mode != mode) |
7763 | err = ipw2100_set_power_mode(priv, mode); | 7863 | err = ipw2100_set_power_mode(priv, mode); |
7764 | done: | 7864 | done: |
7765 | up(&priv->action_sem); | 7865 | mutex_unlock(&priv->action_mutex); |
7766 | return err; | 7866 | return err; |
7767 | } | 7867 | } |
7768 | 7868 | ||
@@ -7814,7 +7914,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev, | |||
7814 | struct ipw2100_priv *priv = ieee80211_priv(dev); | 7914 | struct ipw2100_priv *priv = ieee80211_priv(dev); |
7815 | int err, mode = *(int *)extra; | 7915 | int err, mode = *(int *)extra; |
7816 | 7916 | ||
7817 | down(&priv->action_sem); | 7917 | mutex_lock(&priv->action_mutex); |
7818 | if (!(priv->status & STATUS_INITIALIZED)) { | 7918 | if (!(priv->status & STATUS_INITIALIZED)) { |
7819 | err = -EIO; | 7919 | err = -EIO; |
7820 | goto done; | 7920 | goto done; |
@@ -7832,7 +7932,7 @@ static int ipw2100_wx_set_preamble(struct net_device *dev, | |||
7832 | err = ipw2100_system_config(priv, 0); | 7932 | err = ipw2100_system_config(priv, 0); |
7833 | 7933 | ||
7834 | done: | 7934 | done: |
7835 | up(&priv->action_sem); | 7935 | mutex_unlock(&priv->action_mutex); |
7836 | return err; | 7936 | return err; |
7837 | } | 7937 | } |
7838 | 7938 | ||
@@ -7862,7 +7962,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev, | |||
7862 | struct ipw2100_priv *priv = ieee80211_priv(dev); | 7962 | struct ipw2100_priv *priv = ieee80211_priv(dev); |
7863 | int err, mode = *(int *)extra; | 7963 | int err, mode = *(int *)extra; |
7864 | 7964 | ||
7865 | down(&priv->action_sem); | 7965 | mutex_lock(&priv->action_mutex); |
7866 | if (!(priv->status & STATUS_INITIALIZED)) { | 7966 | if (!(priv->status & STATUS_INITIALIZED)) { |
7867 | err = -EIO; | 7967 | err = -EIO; |
7868 | goto done; | 7968 | goto done; |
@@ -7879,7 +7979,7 @@ static int ipw2100_wx_set_crc_check(struct net_device *dev, | |||
7879 | err = 0; | 7979 | err = 0; |
7880 | 7980 | ||
7881 | done: | 7981 | done: |
7882 | up(&priv->action_sem); | 7982 | mutex_unlock(&priv->action_mutex); |
7883 | return err; | 7983 | return err; |
7884 | } | 7984 | } |
7885 | 7985 | ||
@@ -8184,11 +8284,11 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv) | |||
8184 | if (priv->status & STATUS_STOPPING) | 8284 | if (priv->status & STATUS_STOPPING) |
8185 | return; | 8285 | return; |
8186 | 8286 | ||
8187 | down(&priv->action_sem); | 8287 | mutex_lock(&priv->action_mutex); |
8188 | 8288 | ||
8189 | IPW_DEBUG_WX("enter\n"); | 8289 | IPW_DEBUG_WX("enter\n"); |
8190 | 8290 | ||
8191 | up(&priv->action_sem); | 8291 | mutex_unlock(&priv->action_mutex); |
8192 | 8292 | ||
8193 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 8293 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; |
8194 | 8294 | ||
@@ -8211,7 +8311,7 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv) | |||
8211 | 8311 | ||
8212 | if (!(priv->status & STATUS_ASSOCIATED)) { | 8312 | if (!(priv->status & STATUS_ASSOCIATED)) { |
8213 | IPW_DEBUG_WX("Configuring ESSID\n"); | 8313 | IPW_DEBUG_WX("Configuring ESSID\n"); |
8214 | down(&priv->action_sem); | 8314 | mutex_lock(&priv->action_mutex); |
8215 | /* This is a disassociation event, so kick the firmware to | 8315 | /* This is a disassociation event, so kick the firmware to |
8216 | * look for another AP */ | 8316 | * look for another AP */ |
8217 | if (priv->config & CFG_STATIC_ESSID) | 8317 | if (priv->config & CFG_STATIC_ESSID) |
@@ -8219,7 +8319,7 @@ static void ipw2100_wx_event_work(struct ipw2100_priv *priv) | |||
8219 | 0); | 8319 | 0); |
8220 | else | 8320 | else |
8221 | ipw2100_set_essid(priv, NULL, 0, 0); | 8321 | ipw2100_set_essid(priv, NULL, 0, 0); |
8222 | up(&priv->action_sem); | 8322 | mutex_unlock(&priv->action_mutex); |
8223 | } | 8323 | } |
8224 | 8324 | ||
8225 | wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); | 8325 | wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); |