diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/Kconfig | 7 | ||||
-rw-r--r-- | drivers/net/wireless/airo.c | 331 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2100.c | 48 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2100.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2200.c | 876 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2200.h | 64 | ||||
-rw-r--r-- | drivers/net/wireless/netwave_cs.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/strip.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/wavelan.p.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/wavelan_cs.p.h | 9 |
10 files changed, 814 insertions, 539 deletions
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index ef85d76575a2..a1ede41d9071 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -6,7 +6,8 @@ menu "Wireless LAN (non-hamradio)" | |||
6 | depends on NETDEVICES | 6 | depends on NETDEVICES |
7 | 7 | ||
8 | config NET_RADIO | 8 | config NET_RADIO |
9 | bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions" | 9 | bool "Wireless LAN drivers (non-hamradio)" |
10 | select WIRELESS_EXT | ||
10 | ---help--- | 11 | ---help--- |
11 | Support for wireless LANs and everything having to do with radio, | 12 | Support for wireless LANs and everything having to do with radio, |
12 | but not with amateur radio or FM broadcasting. | 13 | but not with amateur radio or FM broadcasting. |
@@ -239,7 +240,8 @@ config IPW2200_DEBUG | |||
239 | 240 | ||
240 | config AIRO | 241 | config AIRO |
241 | tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" | 242 | tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" |
242 | depends on NET_RADIO && ISA_DMA_API && CRYPTO && (PCI || BROKEN) | 243 | depends on NET_RADIO && ISA_DMA_API && (PCI || BROKEN) |
244 | select CRYPTO | ||
243 | ---help--- | 245 | ---help--- |
244 | This is the standard Linux driver to support Cisco/Aironet ISA and | 246 | This is the standard Linux driver to support Cisco/Aironet ISA and |
245 | PCI 802.11 wireless cards. | 247 | PCI 802.11 wireless cards. |
@@ -387,6 +389,7 @@ config PCMCIA_SPECTRUM | |||
387 | config AIRO_CS | 389 | config AIRO_CS |
388 | tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" | 390 | tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" |
389 | depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) | 391 | depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) |
392 | select CRYPTO | ||
390 | ---help--- | 393 | ---help--- |
391 | This is the standard Linux driver to support Cisco/Aironet PCMCIA | 394 | This is the standard Linux driver to support Cisco/Aironet PCMCIA |
392 | 802.11 wireless cards. This driver is the same as the Aironet | 395 | 802.11 wireless cards. This driver is the same as the Aironet |
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index a4c7ae94614d..ef6495b07890 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/in.h> | 36 | #include <linux/in.h> |
37 | #include <linux/bitops.h> | 37 | #include <linux/bitops.h> |
38 | #include <linux/scatterlist.h> | 38 | #include <linux/scatterlist.h> |
39 | #include <linux/crypto.h> | ||
39 | #include <asm/io.h> | 40 | #include <asm/io.h> |
40 | #include <asm/system.h> | 41 | #include <asm/system.h> |
41 | 42 | ||
@@ -87,14 +88,6 @@ static struct pci_driver airo_driver = { | |||
87 | #include <linux/delay.h> | 88 | #include <linux/delay.h> |
88 | #endif | 89 | #endif |
89 | 90 | ||
90 | /* Support Cisco MIC feature */ | ||
91 | #define MICSUPPORT | ||
92 | |||
93 | #if defined(MICSUPPORT) && !defined(CONFIG_CRYPTO) | ||
94 | #warning MIC support requires Crypto API | ||
95 | #undef MICSUPPORT | ||
96 | #endif | ||
97 | |||
98 | /* Hack to do some power saving */ | 91 | /* Hack to do some power saving */ |
99 | #define POWER_ON_DOWN | 92 | #define POWER_ON_DOWN |
100 | 93 | ||
@@ -1118,7 +1111,6 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp); | |||
1118 | static int writerids(struct net_device *dev, aironet_ioctl *comp); | 1111 | static int writerids(struct net_device *dev, aironet_ioctl *comp); |
1119 | static int flashcard(struct net_device *dev, aironet_ioctl *comp); | 1112 | static int flashcard(struct net_device *dev, aironet_ioctl *comp); |
1120 | #endif /* CISCO_EXT */ | 1113 | #endif /* CISCO_EXT */ |
1121 | #ifdef MICSUPPORT | ||
1122 | static void micinit(struct airo_info *ai); | 1114 | static void micinit(struct airo_info *ai); |
1123 | static int micsetup(struct airo_info *ai); | 1115 | static int micsetup(struct airo_info *ai); |
1124 | static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len); | 1116 | static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len); |
@@ -1127,9 +1119,6 @@ static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, | |||
1127 | static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi); | 1119 | static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi); |
1128 | static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm); | 1120 | static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm); |
1129 | 1121 | ||
1130 | #include <linux/crypto.h> | ||
1131 | #endif | ||
1132 | |||
1133 | struct airo_info { | 1122 | struct airo_info { |
1134 | struct net_device_stats stats; | 1123 | struct net_device_stats stats; |
1135 | struct net_device *dev; | 1124 | struct net_device *dev; |
@@ -1190,12 +1179,10 @@ struct airo_info { | |||
1190 | unsigned long scan_timestamp; /* Time started to scan */ | 1179 | unsigned long scan_timestamp; /* Time started to scan */ |
1191 | struct iw_spy_data spy_data; | 1180 | struct iw_spy_data spy_data; |
1192 | struct iw_public_data wireless_data; | 1181 | struct iw_public_data wireless_data; |
1193 | #ifdef MICSUPPORT | ||
1194 | /* MIC stuff */ | 1182 | /* MIC stuff */ |
1195 | struct crypto_tfm *tfm; | 1183 | struct crypto_tfm *tfm; |
1196 | mic_module mod[2]; | 1184 | mic_module mod[2]; |
1197 | mic_statistics micstats; | 1185 | mic_statistics micstats; |
1198 | #endif | ||
1199 | HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors | 1186 | HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors |
1200 | HostTxDesc txfids[MPI_MAX_FIDS]; | 1187 | HostTxDesc txfids[MPI_MAX_FIDS]; |
1201 | HostRidDesc config_desc; | 1188 | HostRidDesc config_desc; |
@@ -1229,7 +1216,6 @@ static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime); | |||
1229 | static int flashputbuf(struct airo_info *ai); | 1216 | static int flashputbuf(struct airo_info *ai); |
1230 | static int flashrestart(struct airo_info *ai,struct net_device *dev); | 1217 | static int flashrestart(struct airo_info *ai,struct net_device *dev); |
1231 | 1218 | ||
1232 | #ifdef MICSUPPORT | ||
1233 | /*********************************************************************** | 1219 | /*********************************************************************** |
1234 | * MIC ROUTINES * | 1220 | * MIC ROUTINES * |
1235 | *********************************************************************** | 1221 | *********************************************************************** |
@@ -1686,7 +1672,6 @@ static void emmh32_final(emmh32_context *context, u8 digest[4]) | |||
1686 | digest[2] = (val>>8) & 0xFF; | 1672 | digest[2] = (val>>8) & 0xFF; |
1687 | digest[3] = val & 0xFF; | 1673 | digest[3] = val & 0xFF; |
1688 | } | 1674 | } |
1689 | #endif | ||
1690 | 1675 | ||
1691 | static int readBSSListRid(struct airo_info *ai, int first, | 1676 | static int readBSSListRid(struct airo_info *ai, int first, |
1692 | BSSListRid *list) { | 1677 | BSSListRid *list) { |
@@ -2005,7 +1990,6 @@ static int mpi_send_packet (struct net_device *dev) | |||
2005 | * Firmware automaticly puts 802 header on so | 1990 | * Firmware automaticly puts 802 header on so |
2006 | * we don't need to account for it in the length | 1991 | * we don't need to account for it in the length |
2007 | */ | 1992 | */ |
2008 | #ifdef MICSUPPORT | ||
2009 | if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && | 1993 | if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && |
2010 | (ntohs(((u16 *)buffer)[6]) != 0x888E)) { | 1994 | (ntohs(((u16 *)buffer)[6]) != 0x888E)) { |
2011 | MICBuffer pMic; | 1995 | MICBuffer pMic; |
@@ -2022,9 +2006,7 @@ static int mpi_send_packet (struct net_device *dev) | |||
2022 | memcpy (sendbuf, &pMic, sizeof(pMic)); | 2006 | memcpy (sendbuf, &pMic, sizeof(pMic)); |
2023 | sendbuf += sizeof(pMic); | 2007 | sendbuf += sizeof(pMic); |
2024 | memcpy (sendbuf, buffer, len - sizeof(etherHead)); | 2008 | memcpy (sendbuf, buffer, len - sizeof(etherHead)); |
2025 | } else | 2009 | } else { |
2026 | #endif | ||
2027 | { | ||
2028 | *payloadLen = cpu_to_le16(len - sizeof(etherHead)); | 2010 | *payloadLen = cpu_to_le16(len - sizeof(etherHead)); |
2029 | 2011 | ||
2030 | dev->trans_start = jiffies; | 2012 | dev->trans_start = jiffies; |
@@ -2400,9 +2382,7 @@ void stop_airo_card( struct net_device *dev, int freeres ) | |||
2400 | ai->shared, ai->shared_dma); | 2382 | ai->shared, ai->shared_dma); |
2401 | } | 2383 | } |
2402 | } | 2384 | } |
2403 | #ifdef MICSUPPORT | ||
2404 | crypto_free_tfm(ai->tfm); | 2385 | crypto_free_tfm(ai->tfm); |
2405 | #endif | ||
2406 | del_airo_dev( dev ); | 2386 | del_airo_dev( dev ); |
2407 | free_netdev( dev ); | 2387 | free_netdev( dev ); |
2408 | } | 2388 | } |
@@ -2726,9 +2706,7 @@ static struct net_device *_init_airo_card( unsigned short irq, int port, | |||
2726 | ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES); | 2706 | ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES); |
2727 | if (ai->thr_pid < 0) | 2707 | if (ai->thr_pid < 0) |
2728 | goto err_out_free; | 2708 | goto err_out_free; |
2729 | #ifdef MICSUPPORT | ||
2730 | ai->tfm = NULL; | 2709 | ai->tfm = NULL; |
2731 | #endif | ||
2732 | rc = add_airo_dev( dev ); | 2710 | rc = add_airo_dev( dev ); |
2733 | if (rc) | 2711 | if (rc) |
2734 | goto err_out_thr; | 2712 | goto err_out_thr; |
@@ -2969,10 +2947,8 @@ static int airo_thread(void *data) { | |||
2969 | airo_read_wireless_stats(ai); | 2947 | airo_read_wireless_stats(ai); |
2970 | else if (test_bit(JOB_PROMISC, &ai->flags)) | 2948 | else if (test_bit(JOB_PROMISC, &ai->flags)) |
2971 | airo_set_promisc(ai); | 2949 | airo_set_promisc(ai); |
2972 | #ifdef MICSUPPORT | ||
2973 | else if (test_bit(JOB_MIC, &ai->flags)) | 2950 | else if (test_bit(JOB_MIC, &ai->flags)) |
2974 | micinit(ai); | 2951 | micinit(ai); |
2975 | #endif | ||
2976 | else if (test_bit(JOB_EVENT, &ai->flags)) | 2952 | else if (test_bit(JOB_EVENT, &ai->flags)) |
2977 | airo_send_event(dev); | 2953 | airo_send_event(dev); |
2978 | else if (test_bit(JOB_AUTOWEP, &ai->flags)) | 2954 | else if (test_bit(JOB_AUTOWEP, &ai->flags)) |
@@ -3010,12 +2986,10 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) | |||
3010 | 2986 | ||
3011 | if ( status & EV_MIC ) { | 2987 | if ( status & EV_MIC ) { |
3012 | OUT4500( apriv, EVACK, EV_MIC ); | 2988 | OUT4500( apriv, EVACK, EV_MIC ); |
3013 | #ifdef MICSUPPORT | ||
3014 | if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { | 2989 | if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { |
3015 | set_bit(JOB_MIC, &apriv->flags); | 2990 | set_bit(JOB_MIC, &apriv->flags); |
3016 | wake_up_interruptible(&apriv->thr_wait); | 2991 | wake_up_interruptible(&apriv->thr_wait); |
3017 | } | 2992 | } |
3018 | #endif | ||
3019 | } | 2993 | } |
3020 | if ( status & EV_LINK ) { | 2994 | if ( status & EV_LINK ) { |
3021 | union iwreq_data wrqu; | 2995 | union iwreq_data wrqu; |
@@ -3194,11 +3168,8 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) | |||
3194 | } | 3168 | } |
3195 | bap_read (apriv, buffer + hdrlen/2, len, BAP0); | 3169 | bap_read (apriv, buffer + hdrlen/2, len, BAP0); |
3196 | } else { | 3170 | } else { |
3197 | #ifdef MICSUPPORT | ||
3198 | MICBuffer micbuf; | 3171 | MICBuffer micbuf; |
3199 | #endif | ||
3200 | bap_read (apriv, buffer, ETH_ALEN*2, BAP0); | 3172 | bap_read (apriv, buffer, ETH_ALEN*2, BAP0); |
3201 | #ifdef MICSUPPORT | ||
3202 | if (apriv->micstats.enabled) { | 3173 | if (apriv->micstats.enabled) { |
3203 | bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); | 3174 | bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); |
3204 | if (ntohs(micbuf.typelen) > 0x05DC) | 3175 | if (ntohs(micbuf.typelen) > 0x05DC) |
@@ -3211,15 +3182,10 @@ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) | |||
3211 | skb_trim (skb, len + hdrlen); | 3182 | skb_trim (skb, len + hdrlen); |
3212 | } | 3183 | } |
3213 | } | 3184 | } |
3214 | #endif | ||
3215 | bap_read(apriv,buffer+ETH_ALEN,len,BAP0); | 3185 | bap_read(apriv,buffer+ETH_ALEN,len,BAP0); |
3216 | #ifdef MICSUPPORT | ||
3217 | if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { | 3186 | if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { |
3218 | badmic: | 3187 | badmic: |
3219 | dev_kfree_skb_irq (skb); | 3188 | dev_kfree_skb_irq (skb); |
3220 | #else | ||
3221 | if (0) { | ||
3222 | #endif | ||
3223 | badrx: | 3189 | badrx: |
3224 | OUT4500( apriv, EVACK, EV_RX); | 3190 | OUT4500( apriv, EVACK, EV_RX); |
3225 | goto exitrx; | 3191 | goto exitrx; |
@@ -3430,10 +3396,8 @@ static void mpi_receive_802_3(struct airo_info *ai) | |||
3430 | int len = 0; | 3396 | int len = 0; |
3431 | struct sk_buff *skb; | 3397 | struct sk_buff *skb; |
3432 | char *buffer; | 3398 | char *buffer; |
3433 | #ifdef MICSUPPORT | ||
3434 | int off = 0; | 3399 | int off = 0; |
3435 | MICBuffer micbuf; | 3400 | MICBuffer micbuf; |
3436 | #endif | ||
3437 | 3401 | ||
3438 | memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); | 3402 | memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd)); |
3439 | /* Make sure we got something */ | 3403 | /* Make sure we got something */ |
@@ -3448,7 +3412,6 @@ static void mpi_receive_802_3(struct airo_info *ai) | |||
3448 | goto badrx; | 3412 | goto badrx; |
3449 | } | 3413 | } |
3450 | buffer = skb_put(skb,len); | 3414 | buffer = skb_put(skb,len); |
3451 | #ifdef MICSUPPORT | ||
3452 | memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); | 3415 | memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2); |
3453 | if (ai->micstats.enabled) { | 3416 | if (ai->micstats.enabled) { |
3454 | memcpy(&micbuf, | 3417 | memcpy(&micbuf, |
@@ -3470,9 +3433,6 @@ badmic: | |||
3470 | dev_kfree_skb_irq (skb); | 3433 | dev_kfree_skb_irq (skb); |
3471 | goto badrx; | 3434 | goto badrx; |
3472 | } | 3435 | } |
3473 | #else | ||
3474 | memcpy(buffer, ai->rxfids[0].virtual_host_addr, len); | ||
3475 | #endif | ||
3476 | #ifdef WIRELESS_SPY | 3436 | #ifdef WIRELESS_SPY |
3477 | if (ai->spy_data.spy_number > 0) { | 3437 | if (ai->spy_data.spy_number > 0) { |
3478 | char *sa; | 3438 | char *sa; |
@@ -3689,13 +3649,11 @@ static u16 setup_card(struct airo_info *ai, u8 *mac, int lock) | |||
3689 | ai->config.authType = AUTH_OPEN; | 3649 | ai->config.authType = AUTH_OPEN; |
3690 | ai->config.modulation = MOD_CCK; | 3650 | ai->config.modulation = MOD_CCK; |
3691 | 3651 | ||
3692 | #ifdef MICSUPPORT | ||
3693 | if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) && | 3652 | if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) && |
3694 | (micsetup(ai) == SUCCESS)) { | 3653 | (micsetup(ai) == SUCCESS)) { |
3695 | ai->config.opmode |= MODE_MIC; | 3654 | ai->config.opmode |= MODE_MIC; |
3696 | set_bit(FLAG_MIC_CAPABLE, &ai->flags); | 3655 | set_bit(FLAG_MIC_CAPABLE, &ai->flags); |
3697 | } | 3656 | } |
3698 | #endif | ||
3699 | 3657 | ||
3700 | /* Save off the MAC */ | 3658 | /* Save off the MAC */ |
3701 | for( i = 0; i < ETH_ALEN; i++ ) { | 3659 | for( i = 0; i < ETH_ALEN; i++ ) { |
@@ -4170,15 +4128,12 @@ static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket) | |||
4170 | } | 4128 | } |
4171 | len -= ETH_ALEN * 2; | 4129 | len -= ETH_ALEN * 2; |
4172 | 4130 | ||
4173 | #ifdef MICSUPPORT | ||
4174 | if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && | 4131 | if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && |
4175 | (ntohs(((u16 *)pPacket)[6]) != 0x888E)) { | 4132 | (ntohs(((u16 *)pPacket)[6]) != 0x888E)) { |
4176 | if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) | 4133 | if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) |
4177 | return ERROR; | 4134 | return ERROR; |
4178 | miclen = sizeof(pMic); | 4135 | miclen = sizeof(pMic); |
4179 | } | 4136 | } |
4180 | #endif | ||
4181 | |||
4182 | // packet is destination[6], source[6], payload[len-12] | 4137 | // packet is destination[6], source[6], payload[len-12] |
4183 | // write the payload length and dst/src/payload | 4138 | // write the payload length and dst/src/payload |
4184 | if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR; | 4139 | if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR; |
@@ -5801,11 +5756,13 @@ static int airo_set_wap(struct net_device *dev, | |||
5801 | Cmd cmd; | 5756 | Cmd cmd; |
5802 | Resp rsp; | 5757 | Resp rsp; |
5803 | APListRid APList_rid; | 5758 | APListRid APList_rid; |
5804 | static const unsigned char bcast[ETH_ALEN] = { 255, 255, 255, 255, 255, 255 }; | 5759 | static const u8 any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; |
5760 | static const u8 off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; | ||
5805 | 5761 | ||
5806 | if (awrq->sa_family != ARPHRD_ETHER) | 5762 | if (awrq->sa_family != ARPHRD_ETHER) |
5807 | return -EINVAL; | 5763 | return -EINVAL; |
5808 | else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) { | 5764 | else if (!memcmp(any, awrq->sa_data, ETH_ALEN) || |
5765 | !memcmp(off, awrq->sa_data, ETH_ALEN)) { | ||
5809 | memset(&cmd, 0, sizeof(cmd)); | 5766 | memset(&cmd, 0, sizeof(cmd)); |
5810 | cmd.cmd=CMD_LOSE_SYNC; | 5767 | cmd.cmd=CMD_LOSE_SYNC; |
5811 | if (down_interruptible(&local->sem)) | 5768 | if (down_interruptible(&local->sem)) |
@@ -6296,6 +6253,267 @@ static int airo_get_encode(struct net_device *dev, | |||
6296 | 6253 | ||
6297 | /*------------------------------------------------------------------*/ | 6254 | /*------------------------------------------------------------------*/ |
6298 | /* | 6255 | /* |
6256 | * Wireless Handler : set extended Encryption parameters | ||
6257 | */ | ||
6258 | static int airo_set_encodeext(struct net_device *dev, | ||
6259 | struct iw_request_info *info, | ||
6260 | union iwreq_data *wrqu, | ||
6261 | char *extra) | ||
6262 | { | ||
6263 | struct airo_info *local = dev->priv; | ||
6264 | struct iw_point *encoding = &wrqu->encoding; | ||
6265 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | ||
6266 | CapabilityRid cap_rid; /* Card capability info */ | ||
6267 | int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 ); | ||
6268 | u16 currentAuthType = local->config.authType; | ||
6269 | int idx, key_len, alg = ext->alg; /* Check encryption mode */ | ||
6270 | wep_key_t key; | ||
6271 | |||
6272 | /* Is WEP supported ? */ | ||
6273 | readCapabilityRid(local, &cap_rid, 1); | ||
6274 | /* Older firmware doesn't support this... | ||
6275 | if(!(cap_rid.softCap & 2)) { | ||
6276 | return -EOPNOTSUPP; | ||
6277 | } */ | ||
6278 | readConfigRid(local, 1); | ||
6279 | |||
6280 | /* Determine and validate the key index */ | ||
6281 | idx = encoding->flags & IW_ENCODE_INDEX; | ||
6282 | if (idx) { | ||
6283 | if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1)) | ||
6284 | return -EINVAL; | ||
6285 | idx--; | ||
6286 | } else | ||
6287 | idx = get_wep_key(local, 0xffff); | ||
6288 | |||
6289 | if (encoding->flags & IW_ENCODE_DISABLED) | ||
6290 | alg = IW_ENCODE_ALG_NONE; | ||
6291 | |||
6292 | /* Just setting the transmit key? */ | ||
6293 | if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { | ||
6294 | set_wep_key(local, idx, NULL, 0, perm, 1); | ||
6295 | } else { | ||
6296 | /* Set the requested key first */ | ||
6297 | memset(key.key, 0, MAX_KEY_SIZE); | ||
6298 | switch (alg) { | ||
6299 | case IW_ENCODE_ALG_NONE: | ||
6300 | key.len = 0; | ||
6301 | break; | ||
6302 | case IW_ENCODE_ALG_WEP: | ||
6303 | if (ext->key_len > MIN_KEY_SIZE) { | ||
6304 | key.len = MAX_KEY_SIZE; | ||
6305 | } else if (ext->key_len > 0) { | ||
6306 | key.len = MIN_KEY_SIZE; | ||
6307 | } else { | ||
6308 | return -EINVAL; | ||
6309 | } | ||
6310 | key_len = min (ext->key_len, key.len); | ||
6311 | memcpy(key.key, ext->key, key_len); | ||
6312 | break; | ||
6313 | default: | ||
6314 | return -EINVAL; | ||
6315 | } | ||
6316 | /* Send the key to the card */ | ||
6317 | set_wep_key(local, idx, key.key, key.len, perm, 1); | ||
6318 | } | ||
6319 | |||
6320 | /* Read the flags */ | ||
6321 | if(encoding->flags & IW_ENCODE_DISABLED) | ||
6322 | local->config.authType = AUTH_OPEN; // disable encryption | ||
6323 | if(encoding->flags & IW_ENCODE_RESTRICTED) | ||
6324 | local->config.authType = AUTH_SHAREDKEY; // Only Both | ||
6325 | if(encoding->flags & IW_ENCODE_OPEN) | ||
6326 | local->config.authType = AUTH_ENCRYPT; // Only Wep | ||
6327 | /* Commit the changes to flags if needed */ | ||
6328 | if (local->config.authType != currentAuthType) | ||
6329 | set_bit (FLAG_COMMIT, &local->flags); | ||
6330 | |||
6331 | return -EINPROGRESS; | ||
6332 | } | ||
6333 | |||
6334 | |||
6335 | /*------------------------------------------------------------------*/ | ||
6336 | /* | ||
6337 | * Wireless Handler : get extended Encryption parameters | ||
6338 | */ | ||
6339 | static int airo_get_encodeext(struct net_device *dev, | ||
6340 | struct iw_request_info *info, | ||
6341 | union iwreq_data *wrqu, | ||
6342 | char *extra) | ||
6343 | { | ||
6344 | struct airo_info *local = dev->priv; | ||
6345 | struct iw_point *encoding = &wrqu->encoding; | ||
6346 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | ||
6347 | CapabilityRid cap_rid; /* Card capability info */ | ||
6348 | int idx, max_key_len; | ||
6349 | |||
6350 | /* Is it supported ? */ | ||
6351 | readCapabilityRid(local, &cap_rid, 1); | ||
6352 | if(!(cap_rid.softCap & 2)) { | ||
6353 | return -EOPNOTSUPP; | ||
6354 | } | ||
6355 | readConfigRid(local, 1); | ||
6356 | |||
6357 | max_key_len = encoding->length - sizeof(*ext); | ||
6358 | if (max_key_len < 0) | ||
6359 | return -EINVAL; | ||
6360 | |||
6361 | idx = encoding->flags & IW_ENCODE_INDEX; | ||
6362 | if (idx) { | ||
6363 | if (idx < 1 || idx > ((cap_rid.softCap & 0x80) ? 4:1)) | ||
6364 | return -EINVAL; | ||
6365 | idx--; | ||
6366 | } else | ||
6367 | idx = get_wep_key(local, 0xffff); | ||
6368 | |||
6369 | encoding->flags = idx + 1; | ||
6370 | memset(ext, 0, sizeof(*ext)); | ||
6371 | |||
6372 | /* Check encryption mode */ | ||
6373 | switch(local->config.authType) { | ||
6374 | case AUTH_ENCRYPT: | ||
6375 | encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED; | ||
6376 | break; | ||
6377 | case AUTH_SHAREDKEY: | ||
6378 | encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED; | ||
6379 | break; | ||
6380 | default: | ||
6381 | case AUTH_OPEN: | ||
6382 | encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED; | ||
6383 | break; | ||
6384 | } | ||
6385 | /* We can't return the key, so set the proper flag and return zero */ | ||
6386 | encoding->flags |= IW_ENCODE_NOKEY; | ||
6387 | memset(extra, 0, 16); | ||
6388 | |||
6389 | /* Copy the key to the user buffer */ | ||
6390 | ext->key_len = get_wep_key(local, idx); | ||
6391 | if (ext->key_len > 16) { | ||
6392 | ext->key_len=0; | ||
6393 | } | ||
6394 | |||
6395 | return 0; | ||
6396 | } | ||
6397 | |||
6398 | |||
6399 | /*------------------------------------------------------------------*/ | ||
6400 | /* | ||
6401 | * Wireless Handler : set extended authentication parameters | ||
6402 | */ | ||
6403 | static int airo_set_auth(struct net_device *dev, | ||
6404 | struct iw_request_info *info, | ||
6405 | union iwreq_data *wrqu, char *extra) | ||
6406 | { | ||
6407 | struct airo_info *local = dev->priv; | ||
6408 | struct iw_param *param = &wrqu->param; | ||
6409 | u16 currentAuthType = local->config.authType; | ||
6410 | |||
6411 | switch (param->flags & IW_AUTH_INDEX) { | ||
6412 | case IW_AUTH_WPA_VERSION: | ||
6413 | case IW_AUTH_CIPHER_PAIRWISE: | ||
6414 | case IW_AUTH_CIPHER_GROUP: | ||
6415 | case IW_AUTH_KEY_MGMT: | ||
6416 | case IW_AUTH_RX_UNENCRYPTED_EAPOL: | ||
6417 | case IW_AUTH_PRIVACY_INVOKED: | ||
6418 | /* | ||
6419 | * airo does not use these parameters | ||
6420 | */ | ||
6421 | break; | ||
6422 | |||
6423 | case IW_AUTH_DROP_UNENCRYPTED: | ||
6424 | if (param->value) { | ||
6425 | /* Only change auth type if unencrypted */ | ||
6426 | if (currentAuthType == AUTH_OPEN) | ||
6427 | local->config.authType = AUTH_ENCRYPT; | ||
6428 | } else { | ||
6429 | local->config.authType = AUTH_OPEN; | ||
6430 | } | ||
6431 | |||
6432 | /* Commit the changes to flags if needed */ | ||
6433 | if (local->config.authType != currentAuthType) | ||
6434 | set_bit (FLAG_COMMIT, &local->flags); | ||
6435 | break; | ||
6436 | |||
6437 | case IW_AUTH_80211_AUTH_ALG: { | ||
6438 | /* FIXME: What about AUTH_OPEN? This API seems to | ||
6439 | * disallow setting our auth to AUTH_OPEN. | ||
6440 | */ | ||
6441 | if (param->value & IW_AUTH_ALG_SHARED_KEY) { | ||
6442 | local->config.authType = AUTH_SHAREDKEY; | ||
6443 | } else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) { | ||
6444 | local->config.authType = AUTH_ENCRYPT; | ||
6445 | } else | ||
6446 | return -EINVAL; | ||
6447 | break; | ||
6448 | |||
6449 | /* Commit the changes to flags if needed */ | ||
6450 | if (local->config.authType != currentAuthType) | ||
6451 | set_bit (FLAG_COMMIT, &local->flags); | ||
6452 | } | ||
6453 | |||
6454 | case IW_AUTH_WPA_ENABLED: | ||
6455 | /* Silently accept disable of WPA */ | ||
6456 | if (param->value > 0) | ||
6457 | return -EOPNOTSUPP; | ||
6458 | break; | ||
6459 | |||
6460 | default: | ||
6461 | return -EOPNOTSUPP; | ||
6462 | } | ||
6463 | return -EINPROGRESS; | ||
6464 | } | ||
6465 | |||
6466 | |||
6467 | /*------------------------------------------------------------------*/ | ||
6468 | /* | ||
6469 | * Wireless Handler : get extended authentication parameters | ||
6470 | */ | ||
6471 | static int airo_get_auth(struct net_device *dev, | ||
6472 | struct iw_request_info *info, | ||
6473 | union iwreq_data *wrqu, char *extra) | ||
6474 | { | ||
6475 | struct airo_info *local = dev->priv; | ||
6476 | struct iw_param *param = &wrqu->param; | ||
6477 | u16 currentAuthType = local->config.authType; | ||
6478 | |||
6479 | switch (param->flags & IW_AUTH_INDEX) { | ||
6480 | case IW_AUTH_DROP_UNENCRYPTED: | ||
6481 | switch (currentAuthType) { | ||
6482 | case AUTH_SHAREDKEY: | ||
6483 | case AUTH_ENCRYPT: | ||
6484 | param->value = 1; | ||
6485 | break; | ||
6486 | default: | ||
6487 | param->value = 0; | ||
6488 | break; | ||
6489 | } | ||
6490 | break; | ||
6491 | |||
6492 | case IW_AUTH_80211_AUTH_ALG: | ||
6493 | switch (currentAuthType) { | ||
6494 | case AUTH_SHAREDKEY: | ||
6495 | param->value = IW_AUTH_ALG_SHARED_KEY; | ||
6496 | break; | ||
6497 | case AUTH_ENCRYPT: | ||
6498 | default: | ||
6499 | param->value = IW_AUTH_ALG_OPEN_SYSTEM; | ||
6500 | break; | ||
6501 | } | ||
6502 | break; | ||
6503 | |||
6504 | case IW_AUTH_WPA_ENABLED: | ||
6505 | param->value = 0; | ||
6506 | break; | ||
6507 | |||
6508 | default: | ||
6509 | return -EOPNOTSUPP; | ||
6510 | } | ||
6511 | return 0; | ||
6512 | } | ||
6513 | |||
6514 | |||
6515 | /*------------------------------------------------------------------*/ | ||
6516 | /* | ||
6299 | * Wireless Handler : set Tx-Power | 6517 | * Wireless Handler : set Tx-Power |
6300 | */ | 6518 | */ |
6301 | static int airo_set_txpow(struct net_device *dev, | 6519 | static int airo_set_txpow(struct net_device *dev, |
@@ -7050,6 +7268,15 @@ static const iw_handler airo_handler[] = | |||
7050 | (iw_handler) airo_get_encode, /* SIOCGIWENCODE */ | 7268 | (iw_handler) airo_get_encode, /* SIOCGIWENCODE */ |
7051 | (iw_handler) airo_set_power, /* SIOCSIWPOWER */ | 7269 | (iw_handler) airo_set_power, /* SIOCSIWPOWER */ |
7052 | (iw_handler) airo_get_power, /* SIOCGIWPOWER */ | 7270 | (iw_handler) airo_get_power, /* SIOCGIWPOWER */ |
7271 | (iw_handler) NULL, /* -- hole -- */ | ||
7272 | (iw_handler) NULL, /* -- hole -- */ | ||
7273 | (iw_handler) NULL, /* SIOCSIWGENIE */ | ||
7274 | (iw_handler) NULL, /* SIOCGIWGENIE */ | ||
7275 | (iw_handler) airo_set_auth, /* SIOCSIWAUTH */ | ||
7276 | (iw_handler) airo_get_auth, /* SIOCGIWAUTH */ | ||
7277 | (iw_handler) airo_set_encodeext, /* SIOCSIWENCODEEXT */ | ||
7278 | (iw_handler) airo_get_encodeext, /* SIOCGIWENCODEEXT */ | ||
7279 | (iw_handler) NULL, /* SIOCSIWPMKSA */ | ||
7053 | }; | 7280 | }; |
7054 | 7281 | ||
7055 | /* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here. | 7282 | /* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here. |
@@ -7270,13 +7497,11 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { | |||
7270 | case AIROGSTAT: ridcode = RID_STATUS; break; | 7497 | case AIROGSTAT: ridcode = RID_STATUS; break; |
7271 | case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; | 7498 | case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; |
7272 | case AIROGSTATSC32: ridcode = RID_STATS; break; | 7499 | case AIROGSTATSC32: ridcode = RID_STATS; break; |
7273 | #ifdef MICSUPPORT | ||
7274 | case AIROGMICSTATS: | 7500 | case AIROGMICSTATS: |
7275 | if (copy_to_user(comp->data, &ai->micstats, | 7501 | if (copy_to_user(comp->data, &ai->micstats, |
7276 | min((int)comp->len,(int)sizeof(ai->micstats)))) | 7502 | min((int)comp->len,(int)sizeof(ai->micstats)))) |
7277 | return -EFAULT; | 7503 | return -EFAULT; |
7278 | return 0; | 7504 | return 0; |
7279 | #endif | ||
7280 | case AIRORRID: ridcode = comp->ridnum; break; | 7505 | case AIRORRID: ridcode = comp->ridnum; break; |
7281 | default: | 7506 | default: |
7282 | return -EINVAL; | 7507 | return -EINVAL; |
@@ -7308,9 +7533,7 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { | |||
7308 | static int writerids(struct net_device *dev, aironet_ioctl *comp) { | 7533 | static int writerids(struct net_device *dev, aironet_ioctl *comp) { |
7309 | struct airo_info *ai = dev->priv; | 7534 | struct airo_info *ai = dev->priv; |
7310 | int ridcode; | 7535 | int ridcode; |
7311 | #ifdef MICSUPPORT | ||
7312 | int enabled; | 7536 | int enabled; |
7313 | #endif | ||
7314 | Resp rsp; | 7537 | Resp rsp; |
7315 | static int (* writer)(struct airo_info *, u16 rid, const void *, int, int); | 7538 | static int (* writer)(struct airo_info *, u16 rid, const void *, int, int); |
7316 | unsigned char *iobuf; | 7539 | unsigned char *iobuf; |
@@ -7367,11 +7590,9 @@ static int writerids(struct net_device *dev, aironet_ioctl *comp) { | |||
7367 | 7590 | ||
7368 | PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1); | 7591 | PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1); |
7369 | 7592 | ||
7370 | #ifdef MICSUPPORT | ||
7371 | enabled = ai->micstats.enabled; | 7593 | enabled = ai->micstats.enabled; |
7372 | memset(&ai->micstats,0,sizeof(ai->micstats)); | 7594 | memset(&ai->micstats,0,sizeof(ai->micstats)); |
7373 | ai->micstats.enabled = enabled; | 7595 | ai->micstats.enabled = enabled; |
7374 | #endif | ||
7375 | 7596 | ||
7376 | if (copy_to_user(comp->data, iobuf, | 7597 | if (copy_to_user(comp->data, iobuf, |
7377 | min((int)comp->len, (int)RIDSIZE))) { | 7598 | min((int)comp->len, (int)RIDSIZE))) { |
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index 6290c9f7e939..eb79198ac450 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c | |||
@@ -167,7 +167,7 @@ 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.1.4" |
171 | 171 | ||
172 | #define DRV_NAME "ipw2100" | 172 | #define DRV_NAME "ipw2100" |
173 | #define DRV_VERSION IPW2100_VERSION | 173 | #define DRV_VERSION IPW2100_VERSION |
@@ -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 |
@@ -3750,7 +3769,7 @@ static ssize_t store_memory(struct device *d, struct device_attribute *attr, | |||
3750 | struct net_device *dev = priv->net_dev; | 3769 | struct net_device *dev = priv->net_dev; |
3751 | const char *p = buf; | 3770 | const char *p = buf; |
3752 | 3771 | ||
3753 | (void) dev; /* kill unused-var warning for debug-only code */ | 3772 | (void)dev; /* kill unused-var warning for debug-only code */ |
3754 | 3773 | ||
3755 | if (count < 1) | 3774 | if (count < 1) |
3756 | return count; | 3775 | return count; |
@@ -4070,7 +4089,7 @@ static ssize_t store_scan_age(struct device *d, struct device_attribute *attr, | |||
4070 | unsigned long val; | 4089 | unsigned long val; |
4071 | char *p = buffer; | 4090 | char *p = buffer; |
4072 | 4091 | ||
4073 | (void) dev; /* kill unused-var warning for debug-only code */ | 4092 | (void)dev; /* kill unused-var warning for debug-only code */ |
4074 | 4093 | ||
4075 | IPW_DEBUG_INFO("enter\n"); | 4094 | IPW_DEBUG_INFO("enter\n"); |
4076 | 4095 | ||
@@ -5107,12 +5126,13 @@ static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power) | |||
5107 | .host_command_length = 4 | 5126 | .host_command_length = 4 |
5108 | }; | 5127 | }; |
5109 | int err = 0; | 5128 | int err = 0; |
5129 | u32 tmp = tx_power; | ||
5110 | 5130 | ||
5111 | if (tx_power != IPW_TX_POWER_DEFAULT) | 5131 | if (tx_power != IPW_TX_POWER_DEFAULT) |
5112 | tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / | 5132 | tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 / |
5113 | (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); | 5133 | (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM); |
5114 | 5134 | ||
5115 | cmd.host_command_parameters[0] = tx_power; | 5135 | cmd.host_command_parameters[0] = tmp; |
5116 | 5136 | ||
5117 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) | 5137 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) |
5118 | err = ipw2100_hw_send_command(priv, &cmd); | 5138 | err = ipw2100_hw_send_command(priv, &cmd); |
@@ -5365,9 +5385,12 @@ static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode) | |||
5365 | SEC_LEVEL_0, 0, 1); | 5385 | SEC_LEVEL_0, 0, 1); |
5366 | } else { | 5386 | } else { |
5367 | auth_mode = IPW_AUTH_OPEN; | 5387 | auth_mode = IPW_AUTH_OPEN; |
5368 | if ((priv->ieee->sec.flags & SEC_AUTH_MODE) && | 5388 | if (priv->ieee->sec.flags & SEC_AUTH_MODE) { |
5369 | (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) | 5389 | if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY) |
5370 | auth_mode = IPW_AUTH_SHARED; | 5390 | auth_mode = IPW_AUTH_SHARED; |
5391 | else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP) | ||
5392 | auth_mode = IPW_AUTH_LEAP_CISCO_ID; | ||
5393 | } | ||
5371 | 5394 | ||
5372 | sec_level = SEC_LEVEL_0; | 5395 | sec_level = SEC_LEVEL_0; |
5373 | if (priv->ieee->sec.flags & SEC_LEVEL) | 5396 | if (priv->ieee->sec.flags & SEC_LEVEL) |
@@ -5760,6 +5783,9 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) | |||
5760 | } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { | 5783 | } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { |
5761 | sec.auth_mode = WLAN_AUTH_OPEN; | 5784 | sec.auth_mode = WLAN_AUTH_OPEN; |
5762 | ieee->open_wep = 1; | 5785 | ieee->open_wep = 1; |
5786 | } else if (value & IW_AUTH_ALG_LEAP) { | ||
5787 | sec.auth_mode = WLAN_AUTH_LEAP; | ||
5788 | ieee->open_wep = 1; | ||
5763 | } else | 5789 | } else |
5764 | return -EINVAL; | 5790 | return -EINVAL; |
5765 | 5791 | ||
@@ -5771,8 +5797,8 @@ static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value) | |||
5771 | return ret; | 5797 | return ret; |
5772 | } | 5798 | } |
5773 | 5799 | ||
5774 | void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, | 5800 | static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv, |
5775 | char *wpa_ie, int wpa_ie_len) | 5801 | char *wpa_ie, int wpa_ie_len) |
5776 | { | 5802 | { |
5777 | 5803 | ||
5778 | struct ipw2100_wpa_assoc_frame frame; | 5804 | struct ipw2100_wpa_assoc_frame frame; |
diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h index f6c51441fa87..51360910d222 100644 --- a/drivers/net/wireless/ipw2100.h +++ b/drivers/net/wireless/ipw2100.h | |||
@@ -392,8 +392,10 @@ struct ipw2100_notification { | |||
392 | #define IPW_WEP104_CIPHER (1<<5) | 392 | #define IPW_WEP104_CIPHER (1<<5) |
393 | #define IPW_CKIP_CIPHER (1<<6) | 393 | #define IPW_CKIP_CIPHER (1<<6) |
394 | 394 | ||
395 | #define IPW_AUTH_OPEN 0 | 395 | #define IPW_AUTH_OPEN 0 |
396 | #define IPW_AUTH_SHARED 1 | 396 | #define IPW_AUTH_SHARED 1 |
397 | #define IPW_AUTH_LEAP 2 | ||
398 | #define IPW_AUTH_LEAP_CISCO_ID 0x80 | ||
397 | 399 | ||
398 | struct statistic { | 400 | struct statistic { |
399 | int value; | 401 | int value; |
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 14beab4bc91c..0702f0eeb784 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include "ipw2200.h" | 33 | #include "ipw2200.h" |
34 | #include <linux/version.h> | 34 | #include <linux/version.h> |
35 | 35 | ||
36 | #define IPW2200_VERSION "git-1.0.8" | 36 | #define IPW2200_VERSION "git-1.0.10" |
37 | #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver" | 37 | #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2200/2915 Network Driver" |
38 | #define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation" | 38 | #define DRV_COPYRIGHT "Copyright(c) 2003-2005 Intel Corporation" |
39 | #define DRV_VERSION IPW2200_VERSION | 39 | #define DRV_VERSION IPW2200_VERSION |
@@ -55,7 +55,9 @@ static int associate = 1; | |||
55 | static int auto_create = 1; | 55 | static int auto_create = 1; |
56 | static int led = 0; | 56 | static int led = 0; |
57 | static int disable = 0; | 57 | static int disable = 0; |
58 | static int hwcrypto = 1; | 58 | static int bt_coexist = 0; |
59 | static int hwcrypto = 0; | ||
60 | static int roaming = 1; | ||
59 | static const char ipw_modes[] = { | 61 | static const char ipw_modes[] = { |
60 | 'a', 'b', 'g', '?' | 62 | 'a', 'b', 'g', '?' |
61 | }; | 63 | }; |
@@ -227,12 +229,15 @@ static int snprintk_buf(u8 * output, size_t size, const u8 * data, size_t len) | |||
227 | return total; | 229 | return total; |
228 | } | 230 | } |
229 | 231 | ||
232 | /* alias for 32-bit indirect read (for SRAM/reg above 4K), with debug wrapper */ | ||
230 | static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg); | 233 | static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg); |
231 | #define ipw_read_reg32(a, b) _ipw_read_reg32(a, b) | 234 | #define ipw_read_reg32(a, b) _ipw_read_reg32(a, b) |
232 | 235 | ||
236 | /* alias for 8-bit indirect read (for SRAM/reg above 4K), with debug wrapper */ | ||
233 | static u8 _ipw_read_reg8(struct ipw_priv *ipw, u32 reg); | 237 | static u8 _ipw_read_reg8(struct ipw_priv *ipw, u32 reg); |
234 | #define ipw_read_reg8(a, b) _ipw_read_reg8(a, b) | 238 | #define ipw_read_reg8(a, b) _ipw_read_reg8(a, b) |
235 | 239 | ||
240 | /* 8-bit indirect write (for SRAM/reg above 4K), with debug wrapper */ | ||
236 | static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value); | 241 | static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value); |
237 | static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c) | 242 | static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c) |
238 | { | 243 | { |
@@ -241,6 +246,7 @@ static inline void ipw_write_reg8(struct ipw_priv *a, u32 b, u8 c) | |||
241 | _ipw_write_reg8(a, b, c); | 246 | _ipw_write_reg8(a, b, c); |
242 | } | 247 | } |
243 | 248 | ||
249 | /* 16-bit indirect write (for SRAM/reg above 4K), with debug wrapper */ | ||
244 | static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value); | 250 | static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value); |
245 | static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c) | 251 | static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c) |
246 | { | 252 | { |
@@ -249,6 +255,7 @@ static inline void ipw_write_reg16(struct ipw_priv *a, u32 b, u16 c) | |||
249 | _ipw_write_reg16(a, b, c); | 255 | _ipw_write_reg16(a, b, c); |
250 | } | 256 | } |
251 | 257 | ||
258 | /* 32-bit indirect write (for SRAM/reg above 4K), with debug wrapper */ | ||
252 | static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value); | 259 | static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value); |
253 | static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c) | 260 | static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c) |
254 | { | 261 | { |
@@ -257,48 +264,70 @@ static inline void ipw_write_reg32(struct ipw_priv *a, u32 b, u32 c) | |||
257 | _ipw_write_reg32(a, b, c); | 264 | _ipw_write_reg32(a, b, c); |
258 | } | 265 | } |
259 | 266 | ||
267 | /* 8-bit direct write (low 4K) */ | ||
260 | #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs)) | 268 | #define _ipw_write8(ipw, ofs, val) writeb((val), (ipw)->hw_base + (ofs)) |
269 | |||
270 | /* 8-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ | ||
261 | #define ipw_write8(ipw, ofs, val) \ | 271 | #define ipw_write8(ipw, ofs, val) \ |
262 | IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ | 272 | IPW_DEBUG_IO("%s %d: write_direct8(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ |
263 | _ipw_write8(ipw, ofs, val) | 273 | _ipw_write8(ipw, ofs, val) |
264 | 274 | ||
275 | /* 16-bit direct write (low 4K) */ | ||
265 | #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs)) | 276 | #define _ipw_write16(ipw, ofs, val) writew((val), (ipw)->hw_base + (ofs)) |
277 | |||
278 | /* 16-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ | ||
266 | #define ipw_write16(ipw, ofs, val) \ | 279 | #define ipw_write16(ipw, ofs, val) \ |
267 | IPW_DEBUG_IO("%s %d: write_direct16(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ | 280 | IPW_DEBUG_IO("%s %d: write_direct16(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ |
268 | _ipw_write16(ipw, ofs, val) | 281 | _ipw_write16(ipw, ofs, val) |
269 | 282 | ||
283 | /* 32-bit direct write (low 4K) */ | ||
270 | #define _ipw_write32(ipw, ofs, val) writel((val), (ipw)->hw_base + (ofs)) | 284 | #define _ipw_write32(ipw, ofs, val) writel((val), (ipw)->hw_base + (ofs)) |
285 | |||
286 | /* 32-bit direct write (for low 4K of SRAM/regs), with debug wrapper */ | ||
271 | #define ipw_write32(ipw, ofs, val) \ | 287 | #define ipw_write32(ipw, ofs, val) \ |
272 | IPW_DEBUG_IO("%s %d: write_direct32(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ | 288 | IPW_DEBUG_IO("%s %d: write_direct32(0x%08X, 0x%08X)\n", __FILE__, __LINE__, (u32)(ofs), (u32)(val)); \ |
273 | _ipw_write32(ipw, ofs, val) | 289 | _ipw_write32(ipw, ofs, val) |
274 | 290 | ||
291 | /* 8-bit direct read (low 4K) */ | ||
275 | #define _ipw_read8(ipw, ofs) readb((ipw)->hw_base + (ofs)) | 292 | #define _ipw_read8(ipw, ofs) readb((ipw)->hw_base + (ofs)) |
293 | |||
294 | /* 8-bit direct read (low 4K), with debug wrapper */ | ||
276 | static inline u8 __ipw_read8(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) | 295 | static inline u8 __ipw_read8(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) |
277 | { | 296 | { |
278 | IPW_DEBUG_IO("%s %d: read_direct8(0x%08X)\n", f, l, (u32) (ofs)); | 297 | IPW_DEBUG_IO("%s %d: read_direct8(0x%08X)\n", f, l, (u32) (ofs)); |
279 | return _ipw_read8(ipw, ofs); | 298 | return _ipw_read8(ipw, ofs); |
280 | } | 299 | } |
281 | 300 | ||
301 | /* alias to 8-bit direct read (low 4K of SRAM/regs), with debug wrapper */ | ||
282 | #define ipw_read8(ipw, ofs) __ipw_read8(__FILE__, __LINE__, ipw, ofs) | 302 | #define ipw_read8(ipw, ofs) __ipw_read8(__FILE__, __LINE__, ipw, ofs) |
283 | 303 | ||
304 | /* 16-bit direct read (low 4K) */ | ||
284 | #define _ipw_read16(ipw, ofs) readw((ipw)->hw_base + (ofs)) | 305 | #define _ipw_read16(ipw, ofs) readw((ipw)->hw_base + (ofs)) |
306 | |||
307 | /* 16-bit direct read (low 4K), with debug wrapper */ | ||
285 | static inline u16 __ipw_read16(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) | 308 | static inline u16 __ipw_read16(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) |
286 | { | 309 | { |
287 | IPW_DEBUG_IO("%s %d: read_direct16(0x%08X)\n", f, l, (u32) (ofs)); | 310 | IPW_DEBUG_IO("%s %d: read_direct16(0x%08X)\n", f, l, (u32) (ofs)); |
288 | return _ipw_read16(ipw, ofs); | 311 | return _ipw_read16(ipw, ofs); |
289 | } | 312 | } |
290 | 313 | ||
314 | /* alias to 16-bit direct read (low 4K of SRAM/regs), with debug wrapper */ | ||
291 | #define ipw_read16(ipw, ofs) __ipw_read16(__FILE__, __LINE__, ipw, ofs) | 315 | #define ipw_read16(ipw, ofs) __ipw_read16(__FILE__, __LINE__, ipw, ofs) |
292 | 316 | ||
317 | /* 32-bit direct read (low 4K) */ | ||
293 | #define _ipw_read32(ipw, ofs) readl((ipw)->hw_base + (ofs)) | 318 | #define _ipw_read32(ipw, ofs) readl((ipw)->hw_base + (ofs)) |
319 | |||
320 | /* 32-bit direct read (low 4K), with debug wrapper */ | ||
294 | static inline u32 __ipw_read32(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) | 321 | static inline u32 __ipw_read32(char *f, u32 l, struct ipw_priv *ipw, u32 ofs) |
295 | { | 322 | { |
296 | IPW_DEBUG_IO("%s %d: read_direct32(0x%08X)\n", f, l, (u32) (ofs)); | 323 | IPW_DEBUG_IO("%s %d: read_direct32(0x%08X)\n", f, l, (u32) (ofs)); |
297 | return _ipw_read32(ipw, ofs); | 324 | return _ipw_read32(ipw, ofs); |
298 | } | 325 | } |
299 | 326 | ||
327 | /* alias to 32-bit direct read (low 4K of SRAM/regs), with debug wrapper */ | ||
300 | #define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs) | 328 | #define ipw_read32(ipw, ofs) __ipw_read32(__FILE__, __LINE__, ipw, ofs) |
301 | 329 | ||
330 | /* multi-byte read (above 4K), with debug wrapper */ | ||
302 | static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int); | 331 | static void _ipw_read_indirect(struct ipw_priv *, u32, u8 *, int); |
303 | static inline void __ipw_read_indirect(const char *f, int l, | 332 | static inline void __ipw_read_indirect(const char *f, int l, |
304 | struct ipw_priv *a, u32 b, u8 * c, int d) | 333 | struct ipw_priv *a, u32 b, u8 * c, int d) |
@@ -308,15 +337,17 @@ static inline void __ipw_read_indirect(const char *f, int l, | |||
308 | _ipw_read_indirect(a, b, c, d); | 337 | _ipw_read_indirect(a, b, c, d); |
309 | } | 338 | } |
310 | 339 | ||
340 | /* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */ | ||
311 | #define ipw_read_indirect(a, b, c, d) __ipw_read_indirect(__FILE__, __LINE__, a, b, c, d) | 341 | #define ipw_read_indirect(a, b, c, d) __ipw_read_indirect(__FILE__, __LINE__, a, b, c, d) |
312 | 342 | ||
343 | /* alias to multi-byte read (SRAM/regs above 4K), with debug wrapper */ | ||
313 | static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data, | 344 | static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * data, |
314 | int num); | 345 | int num); |
315 | #define ipw_write_indirect(a, b, c, d) \ | 346 | #define ipw_write_indirect(a, b, c, d) \ |
316 | IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \ | 347 | IPW_DEBUG_IO("%s %d: write_indirect(0x%08X) %d bytes\n", __FILE__, __LINE__, (u32)(b), d); \ |
317 | _ipw_write_indirect(a, b, c, d) | 348 | _ipw_write_indirect(a, b, c, d) |
318 | 349 | ||
319 | /* indirect write s */ | 350 | /* 32-bit indirect write (above 4K) */ |
320 | static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) | 351 | static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) |
321 | { | 352 | { |
322 | IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value); | 353 | IPW_DEBUG_IO(" %p : reg = 0x%8X : value = 0x%8X\n", priv, reg, value); |
@@ -324,22 +355,29 @@ static void _ipw_write_reg32(struct ipw_priv *priv, u32 reg, u32 value) | |||
324 | _ipw_write32(priv, IPW_INDIRECT_DATA, value); | 355 | _ipw_write32(priv, IPW_INDIRECT_DATA, value); |
325 | } | 356 | } |
326 | 357 | ||
358 | /* 8-bit indirect write (above 4K) */ | ||
327 | static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value) | 359 | static void _ipw_write_reg8(struct ipw_priv *priv, u32 reg, u8 value) |
328 | { | 360 | { |
361 | u32 aligned_addr = reg & IPW_INDIRECT_ADDR_MASK; /* dword align */ | ||
362 | u32 dif_len = reg - aligned_addr; | ||
363 | |||
329 | IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); | 364 | IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); |
330 | _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK); | 365 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); |
331 | _ipw_write8(priv, IPW_INDIRECT_DATA, value); | 366 | _ipw_write8(priv, IPW_INDIRECT_DATA + dif_len, value); |
332 | } | 367 | } |
333 | 368 | ||
369 | /* 16-bit indirect write (above 4K) */ | ||
334 | static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value) | 370 | static void _ipw_write_reg16(struct ipw_priv *priv, u32 reg, u16 value) |
335 | { | 371 | { |
372 | u32 aligned_addr = reg & IPW_INDIRECT_ADDR_MASK; /* dword align */ | ||
373 | u32 dif_len = (reg - aligned_addr) & (~0x1ul); | ||
374 | |||
336 | IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); | 375 | IPW_DEBUG_IO(" reg = 0x%8X : value = 0x%8X\n", reg, value); |
337 | _ipw_write32(priv, IPW_INDIRECT_ADDR, reg & IPW_INDIRECT_ADDR_MASK); | 376 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); |
338 | _ipw_write16(priv, IPW_INDIRECT_DATA, value); | 377 | _ipw_write16(priv, IPW_INDIRECT_DATA + dif_len, value); |
339 | } | 378 | } |
340 | 379 | ||
341 | /* indirect read s */ | 380 | /* 8-bit indirect read (above 4K) */ |
342 | |||
343 | static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) | 381 | static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) |
344 | { | 382 | { |
345 | u32 word; | 383 | u32 word; |
@@ -349,6 +387,7 @@ static u8 _ipw_read_reg8(struct ipw_priv *priv, u32 reg) | |||
349 | return (word >> ((reg & 0x3) * 8)) & 0xff; | 387 | return (word >> ((reg & 0x3) * 8)) & 0xff; |
350 | } | 388 | } |
351 | 389 | ||
390 | /* 32-bit indirect read (above 4K) */ | ||
352 | static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg) | 391 | static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg) |
353 | { | 392 | { |
354 | u32 value; | 393 | u32 value; |
@@ -361,11 +400,12 @@ static u32 _ipw_read_reg32(struct ipw_priv *priv, u32 reg) | |||
361 | return value; | 400 | return value; |
362 | } | 401 | } |
363 | 402 | ||
364 | /* iterative/auto-increment 32 bit reads and writes */ | 403 | /* General purpose, no alignment requirement, iterative (multi-byte) read, */ |
404 | /* for area above 1st 4K of SRAM/reg space */ | ||
365 | static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | 405 | static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, |
366 | int num) | 406 | int num) |
367 | { | 407 | { |
368 | u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; | 408 | u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; /* dword align */ |
369 | u32 dif_len = addr - aligned_addr; | 409 | u32 dif_len = addr - aligned_addr; |
370 | u32 i; | 410 | u32 i; |
371 | 411 | ||
@@ -375,7 +415,7 @@ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | |||
375 | return; | 415 | return; |
376 | } | 416 | } |
377 | 417 | ||
378 | /* Read the first nibble byte by byte */ | 418 | /* Read the first dword (or portion) byte by byte */ |
379 | if (unlikely(dif_len)) { | 419 | if (unlikely(dif_len)) { |
380 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); | 420 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); |
381 | /* Start reading at aligned_addr + dif_len */ | 421 | /* Start reading at aligned_addr + dif_len */ |
@@ -384,11 +424,12 @@ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | |||
384 | aligned_addr += 4; | 424 | aligned_addr += 4; |
385 | } | 425 | } |
386 | 426 | ||
427 | /* Read all of the middle dwords as dwords, with auto-increment */ | ||
387 | _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); | 428 | _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); |
388 | for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) | 429 | for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) |
389 | *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA); | 430 | *(u32 *) buf = _ipw_read32(priv, IPW_AUTOINC_DATA); |
390 | 431 | ||
391 | /* Copy the last nibble */ | 432 | /* Read the last dword (or portion) byte by byte */ |
392 | if (unlikely(num)) { | 433 | if (unlikely(num)) { |
393 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); | 434 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); |
394 | for (i = 0; num > 0; i++, num--) | 435 | for (i = 0; num > 0; i++, num--) |
@@ -396,10 +437,12 @@ static void _ipw_read_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | |||
396 | } | 437 | } |
397 | } | 438 | } |
398 | 439 | ||
440 | /* General purpose, no alignment requirement, iterative (multi-byte) write, */ | ||
441 | /* for area above 1st 4K of SRAM/reg space */ | ||
399 | static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | 442 | static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, |
400 | int num) | 443 | int num) |
401 | { | 444 | { |
402 | u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; | 445 | u32 aligned_addr = addr & IPW_INDIRECT_ADDR_MASK; /* dword align */ |
403 | u32 dif_len = addr - aligned_addr; | 446 | u32 dif_len = addr - aligned_addr; |
404 | u32 i; | 447 | u32 i; |
405 | 448 | ||
@@ -409,20 +452,21 @@ static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | |||
409 | return; | 452 | return; |
410 | } | 453 | } |
411 | 454 | ||
412 | /* Write the first nibble byte by byte */ | 455 | /* Write the first dword (or portion) byte by byte */ |
413 | if (unlikely(dif_len)) { | 456 | if (unlikely(dif_len)) { |
414 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); | 457 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); |
415 | /* Start reading at aligned_addr + dif_len */ | 458 | /* Start writing at aligned_addr + dif_len */ |
416 | for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++) | 459 | for (i = dif_len; ((i < 4) && (num > 0)); i++, num--, buf++) |
417 | _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf); | 460 | _ipw_write8(priv, IPW_INDIRECT_DATA + i, *buf); |
418 | aligned_addr += 4; | 461 | aligned_addr += 4; |
419 | } | 462 | } |
420 | 463 | ||
464 | /* Write all of the middle dwords as dwords, with auto-increment */ | ||
421 | _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); | 465 | _ipw_write32(priv, IPW_AUTOINC_ADDR, aligned_addr); |
422 | for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) | 466 | for (; num >= 4; buf += 4, aligned_addr += 4, num -= 4) |
423 | _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf); | 467 | _ipw_write32(priv, IPW_AUTOINC_DATA, *(u32 *) buf); |
424 | 468 | ||
425 | /* Copy the last nibble */ | 469 | /* Write the last dword (or portion) byte by byte */ |
426 | if (unlikely(num)) { | 470 | if (unlikely(num)) { |
427 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); | 471 | _ipw_write32(priv, IPW_INDIRECT_ADDR, aligned_addr); |
428 | for (i = 0; num > 0; i++, num--, buf++) | 472 | for (i = 0; num > 0; i++, num--, buf++) |
@@ -430,17 +474,21 @@ static void _ipw_write_indirect(struct ipw_priv *priv, u32 addr, u8 * buf, | |||
430 | } | 474 | } |
431 | } | 475 | } |
432 | 476 | ||
477 | /* General purpose, no alignment requirement, iterative (multi-byte) write, */ | ||
478 | /* for 1st 4K of SRAM/regs space */ | ||
433 | static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf, | 479 | static void ipw_write_direct(struct ipw_priv *priv, u32 addr, void *buf, |
434 | int num) | 480 | int num) |
435 | { | 481 | { |
436 | memcpy_toio((priv->hw_base + addr), buf, num); | 482 | memcpy_toio((priv->hw_base + addr), buf, num); |
437 | } | 483 | } |
438 | 484 | ||
485 | /* Set bit(s) in low 4K of SRAM/regs */ | ||
439 | static inline void ipw_set_bit(struct ipw_priv *priv, u32 reg, u32 mask) | 486 | static inline void ipw_set_bit(struct ipw_priv *priv, u32 reg, u32 mask) |
440 | { | 487 | { |
441 | ipw_write32(priv, reg, ipw_read32(priv, reg) | mask); | 488 | ipw_write32(priv, reg, ipw_read32(priv, reg) | mask); |
442 | } | 489 | } |
443 | 490 | ||
491 | /* Clear bit(s) in low 4K of SRAM/regs */ | ||
444 | static inline void ipw_clear_bit(struct ipw_priv *priv, u32 reg, u32 mask) | 492 | static inline void ipw_clear_bit(struct ipw_priv *priv, u32 reg, u32 mask) |
445 | { | 493 | { |
446 | ipw_write32(priv, reg, ipw_read32(priv, reg) & ~mask); | 494 | ipw_write32(priv, reg, ipw_read32(priv, reg) & ~mask); |
@@ -701,7 +749,7 @@ static void ipw_init_ordinals(struct ipw_priv *priv) | |||
701 | 749 | ||
702 | } | 750 | } |
703 | 751 | ||
704 | u32 ipw_register_toggle(u32 reg) | 752 | static u32 ipw_register_toggle(u32 reg) |
705 | { | 753 | { |
706 | reg &= ~IPW_START_STANDBY; | 754 | reg &= ~IPW_START_STANDBY; |
707 | if (reg & IPW_GATE_ODMA) | 755 | if (reg & IPW_GATE_ODMA) |
@@ -722,11 +770,11 @@ u32 ipw_register_toggle(u32 reg) | |||
722 | * - On radio OFF, turn off any LEDs started during radio on | 770 | * - On radio OFF, turn off any LEDs started during radio on |
723 | * | 771 | * |
724 | */ | 772 | */ |
725 | #define LD_TIME_LINK_ON 300 | 773 | #define LD_TIME_LINK_ON msecs_to_jiffies(300) |
726 | #define LD_TIME_LINK_OFF 2700 | 774 | #define LD_TIME_LINK_OFF msecs_to_jiffies(2700) |
727 | #define LD_TIME_ACT_ON 250 | 775 | #define LD_TIME_ACT_ON msecs_to_jiffies(250) |
728 | 776 | ||
729 | void ipw_led_link_on(struct ipw_priv *priv) | 777 | static void ipw_led_link_on(struct ipw_priv *priv) |
730 | { | 778 | { |
731 | unsigned long flags; | 779 | unsigned long flags; |
732 | u32 led; | 780 | u32 led; |
@@ -764,12 +812,12 @@ void ipw_led_link_on(struct ipw_priv *priv) | |||
764 | static void ipw_bg_led_link_on(void *data) | 812 | static void ipw_bg_led_link_on(void *data) |
765 | { | 813 | { |
766 | struct ipw_priv *priv = data; | 814 | struct ipw_priv *priv = data; |
767 | down(&priv->sem); | 815 | mutex_lock(&priv->mutex); |
768 | ipw_led_link_on(data); | 816 | ipw_led_link_on(data); |
769 | up(&priv->sem); | 817 | mutex_unlock(&priv->mutex); |
770 | } | 818 | } |
771 | 819 | ||
772 | void ipw_led_link_off(struct ipw_priv *priv) | 820 | static void ipw_led_link_off(struct ipw_priv *priv) |
773 | { | 821 | { |
774 | unsigned long flags; | 822 | unsigned long flags; |
775 | u32 led; | 823 | u32 led; |
@@ -808,9 +856,9 @@ void ipw_led_link_off(struct ipw_priv *priv) | |||
808 | static void ipw_bg_led_link_off(void *data) | 856 | static void ipw_bg_led_link_off(void *data) |
809 | { | 857 | { |
810 | struct ipw_priv *priv = data; | 858 | struct ipw_priv *priv = data; |
811 | down(&priv->sem); | 859 | mutex_lock(&priv->mutex); |
812 | ipw_led_link_off(data); | 860 | ipw_led_link_off(data); |
813 | up(&priv->sem); | 861 | mutex_unlock(&priv->mutex); |
814 | } | 862 | } |
815 | 863 | ||
816 | static void __ipw_led_activity_on(struct ipw_priv *priv) | 864 | static void __ipw_led_activity_on(struct ipw_priv *priv) |
@@ -847,6 +895,7 @@ static void __ipw_led_activity_on(struct ipw_priv *priv) | |||
847 | } | 895 | } |
848 | } | 896 | } |
849 | 897 | ||
898 | #if 0 | ||
850 | void ipw_led_activity_on(struct ipw_priv *priv) | 899 | void ipw_led_activity_on(struct ipw_priv *priv) |
851 | { | 900 | { |
852 | unsigned long flags; | 901 | unsigned long flags; |
@@ -854,8 +903,9 @@ void ipw_led_activity_on(struct ipw_priv *priv) | |||
854 | __ipw_led_activity_on(priv); | 903 | __ipw_led_activity_on(priv); |
855 | spin_unlock_irqrestore(&priv->lock, flags); | 904 | spin_unlock_irqrestore(&priv->lock, flags); |
856 | } | 905 | } |
906 | #endif /* 0 */ | ||
857 | 907 | ||
858 | void ipw_led_activity_off(struct ipw_priv *priv) | 908 | static void ipw_led_activity_off(struct ipw_priv *priv) |
859 | { | 909 | { |
860 | unsigned long flags; | 910 | unsigned long flags; |
861 | u32 led; | 911 | u32 led; |
@@ -885,12 +935,12 @@ void ipw_led_activity_off(struct ipw_priv *priv) | |||
885 | static void ipw_bg_led_activity_off(void *data) | 935 | static void ipw_bg_led_activity_off(void *data) |
886 | { | 936 | { |
887 | struct ipw_priv *priv = data; | 937 | struct ipw_priv *priv = data; |
888 | down(&priv->sem); | 938 | mutex_lock(&priv->mutex); |
889 | ipw_led_activity_off(data); | 939 | ipw_led_activity_off(data); |
890 | up(&priv->sem); | 940 | mutex_unlock(&priv->mutex); |
891 | } | 941 | } |
892 | 942 | ||
893 | void ipw_led_band_on(struct ipw_priv *priv) | 943 | static void ipw_led_band_on(struct ipw_priv *priv) |
894 | { | 944 | { |
895 | unsigned long flags; | 945 | unsigned long flags; |
896 | u32 led; | 946 | u32 led; |
@@ -925,7 +975,7 @@ void ipw_led_band_on(struct ipw_priv *priv) | |||
925 | spin_unlock_irqrestore(&priv->lock, flags); | 975 | spin_unlock_irqrestore(&priv->lock, flags); |
926 | } | 976 | } |
927 | 977 | ||
928 | void ipw_led_band_off(struct ipw_priv *priv) | 978 | static void ipw_led_band_off(struct ipw_priv *priv) |
929 | { | 979 | { |
930 | unsigned long flags; | 980 | unsigned long flags; |
931 | u32 led; | 981 | u32 led; |
@@ -948,24 +998,24 @@ void ipw_led_band_off(struct ipw_priv *priv) | |||
948 | spin_unlock_irqrestore(&priv->lock, flags); | 998 | spin_unlock_irqrestore(&priv->lock, flags); |
949 | } | 999 | } |
950 | 1000 | ||
951 | void ipw_led_radio_on(struct ipw_priv *priv) | 1001 | static void ipw_led_radio_on(struct ipw_priv *priv) |
952 | { | 1002 | { |
953 | ipw_led_link_on(priv); | 1003 | ipw_led_link_on(priv); |
954 | } | 1004 | } |
955 | 1005 | ||
956 | void ipw_led_radio_off(struct ipw_priv *priv) | 1006 | static void ipw_led_radio_off(struct ipw_priv *priv) |
957 | { | 1007 | { |
958 | ipw_led_activity_off(priv); | 1008 | ipw_led_activity_off(priv); |
959 | ipw_led_link_off(priv); | 1009 | ipw_led_link_off(priv); |
960 | } | 1010 | } |
961 | 1011 | ||
962 | void ipw_led_link_up(struct ipw_priv *priv) | 1012 | static void ipw_led_link_up(struct ipw_priv *priv) |
963 | { | 1013 | { |
964 | /* Set the Link Led on for all nic types */ | 1014 | /* Set the Link Led on for all nic types */ |
965 | ipw_led_link_on(priv); | 1015 | ipw_led_link_on(priv); |
966 | } | 1016 | } |
967 | 1017 | ||
968 | void ipw_led_link_down(struct ipw_priv *priv) | 1018 | static void ipw_led_link_down(struct ipw_priv *priv) |
969 | { | 1019 | { |
970 | ipw_led_activity_off(priv); | 1020 | ipw_led_activity_off(priv); |
971 | ipw_led_link_off(priv); | 1021 | ipw_led_link_off(priv); |
@@ -974,7 +1024,7 @@ void ipw_led_link_down(struct ipw_priv *priv) | |||
974 | ipw_led_radio_off(priv); | 1024 | ipw_led_radio_off(priv); |
975 | } | 1025 | } |
976 | 1026 | ||
977 | void ipw_led_init(struct ipw_priv *priv) | 1027 | static void ipw_led_init(struct ipw_priv *priv) |
978 | { | 1028 | { |
979 | priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE]; | 1029 | priv->nic_type = priv->eeprom[EEPROM_NIC_TYPE]; |
980 | 1030 | ||
@@ -1025,7 +1075,7 @@ void ipw_led_init(struct ipw_priv *priv) | |||
1025 | } | 1075 | } |
1026 | } | 1076 | } |
1027 | 1077 | ||
1028 | void ipw_led_shutdown(struct ipw_priv *priv) | 1078 | static void ipw_led_shutdown(struct ipw_priv *priv) |
1029 | { | 1079 | { |
1030 | ipw_led_activity_off(priv); | 1080 | ipw_led_activity_off(priv); |
1031 | ipw_led_link_off(priv); | 1081 | ipw_led_link_off(priv); |
@@ -1074,6 +1124,7 @@ static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, | |||
1074 | 1124 | ||
1075 | static inline u32 ipw_get_event_log_len(struct ipw_priv *priv) | 1125 | static inline u32 ipw_get_event_log_len(struct ipw_priv *priv) |
1076 | { | 1126 | { |
1127 | /* length = 1st dword in log */ | ||
1077 | return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG)); | 1128 | return ipw_read_reg32(priv, ipw_read32(priv, IPW_EVENT_LOG)); |
1078 | } | 1129 | } |
1079 | 1130 | ||
@@ -1870,7 +1921,8 @@ static char *get_cmd_string(u8 cmd) | |||
1870 | } | 1921 | } |
1871 | 1922 | ||
1872 | #define HOST_COMPLETE_TIMEOUT HZ | 1923 | #define HOST_COMPLETE_TIMEOUT HZ |
1873 | static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) | 1924 | |
1925 | static int __ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) | ||
1874 | { | 1926 | { |
1875 | int rc = 0; | 1927 | int rc = 0; |
1876 | unsigned long flags; | 1928 | unsigned long flags; |
@@ -1897,9 +1949,15 @@ static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) | |||
1897 | IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n", | 1949 | IPW_DEBUG_HC("%s command (#%d) %d bytes: 0x%08X\n", |
1898 | get_cmd_string(cmd->cmd), cmd->cmd, cmd->len, | 1950 | get_cmd_string(cmd->cmd), cmd->cmd, cmd->len, |
1899 | priv->status); | 1951 | priv->status); |
1900 | printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len); | ||
1901 | 1952 | ||
1902 | rc = ipw_queue_tx_hcmd(priv, cmd->cmd, &cmd->param, cmd->len, 0); | 1953 | #ifndef DEBUG_CMD_WEP_KEY |
1954 | if (cmd->cmd == IPW_CMD_WEP_KEY) | ||
1955 | IPW_DEBUG_HC("WEP_KEY command masked out for secure.\n"); | ||
1956 | else | ||
1957 | #endif | ||
1958 | printk_buf(IPW_DL_HOST_COMMAND, (u8 *) cmd->param, cmd->len); | ||
1959 | |||
1960 | rc = ipw_queue_tx_hcmd(priv, cmd->cmd, cmd->param, cmd->len, 0); | ||
1903 | if (rc) { | 1961 | if (rc) { |
1904 | priv->status &= ~STATUS_HCMD_ACTIVE; | 1962 | priv->status &= ~STATUS_HCMD_ACTIVE; |
1905 | IPW_ERROR("Failed to send %s: Reason %d\n", | 1963 | IPW_ERROR("Failed to send %s: Reason %d\n", |
@@ -1942,61 +2000,62 @@ static int ipw_send_cmd(struct ipw_priv *priv, struct host_cmd *cmd) | |||
1942 | return rc; | 2000 | return rc; |
1943 | } | 2001 | } |
1944 | 2002 | ||
1945 | static int ipw_send_host_complete(struct ipw_priv *priv) | 2003 | static int ipw_send_cmd_simple(struct ipw_priv *priv, u8 command) |
1946 | { | 2004 | { |
1947 | struct host_cmd cmd = { | 2005 | struct host_cmd cmd = { |
1948 | .cmd = IPW_CMD_HOST_COMPLETE, | 2006 | .cmd = command, |
1949 | .len = 0 | ||
1950 | }; | 2007 | }; |
1951 | 2008 | ||
2009 | return __ipw_send_cmd(priv, &cmd); | ||
2010 | } | ||
2011 | |||
2012 | static int ipw_send_cmd_pdu(struct ipw_priv *priv, u8 command, u8 len, | ||
2013 | void *data) | ||
2014 | { | ||
2015 | struct host_cmd cmd = { | ||
2016 | .cmd = command, | ||
2017 | .len = len, | ||
2018 | .param = data, | ||
2019 | }; | ||
2020 | |||
2021 | return __ipw_send_cmd(priv, &cmd); | ||
2022 | } | ||
2023 | |||
2024 | static int ipw_send_host_complete(struct ipw_priv *priv) | ||
2025 | { | ||
1952 | if (!priv) { | 2026 | if (!priv) { |
1953 | IPW_ERROR("Invalid args\n"); | 2027 | IPW_ERROR("Invalid args\n"); |
1954 | return -1; | 2028 | return -1; |
1955 | } | 2029 | } |
1956 | 2030 | ||
1957 | return ipw_send_cmd(priv, &cmd); | 2031 | return ipw_send_cmd_simple(priv, IPW_CMD_HOST_COMPLETE); |
1958 | } | 2032 | } |
1959 | 2033 | ||
1960 | static int ipw_send_system_config(struct ipw_priv *priv, | 2034 | static int ipw_send_system_config(struct ipw_priv *priv, |
1961 | struct ipw_sys_config *config) | 2035 | struct ipw_sys_config *config) |
1962 | { | 2036 | { |
1963 | struct host_cmd cmd = { | ||
1964 | .cmd = IPW_CMD_SYSTEM_CONFIG, | ||
1965 | .len = sizeof(*config) | ||
1966 | }; | ||
1967 | |||
1968 | if (!priv || !config) { | 2037 | if (!priv || !config) { |
1969 | IPW_ERROR("Invalid args\n"); | 2038 | IPW_ERROR("Invalid args\n"); |
1970 | return -1; | 2039 | return -1; |
1971 | } | 2040 | } |
1972 | 2041 | ||
1973 | memcpy(cmd.param, config, sizeof(*config)); | 2042 | return ipw_send_cmd_pdu(priv, IPW_CMD_SYSTEM_CONFIG, sizeof(*config), |
1974 | return ipw_send_cmd(priv, &cmd); | 2043 | config); |
1975 | } | 2044 | } |
1976 | 2045 | ||
1977 | static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) | 2046 | static int ipw_send_ssid(struct ipw_priv *priv, u8 * ssid, int len) |
1978 | { | 2047 | { |
1979 | struct host_cmd cmd = { | ||
1980 | .cmd = IPW_CMD_SSID, | ||
1981 | .len = min(len, IW_ESSID_MAX_SIZE) | ||
1982 | }; | ||
1983 | |||
1984 | if (!priv || !ssid) { | 2048 | if (!priv || !ssid) { |
1985 | IPW_ERROR("Invalid args\n"); | 2049 | IPW_ERROR("Invalid args\n"); |
1986 | return -1; | 2050 | return -1; |
1987 | } | 2051 | } |
1988 | 2052 | ||
1989 | memcpy(cmd.param, ssid, cmd.len); | 2053 | return ipw_send_cmd_pdu(priv, IPW_CMD_SSID, min(len, IW_ESSID_MAX_SIZE), |
1990 | return ipw_send_cmd(priv, &cmd); | 2054 | ssid); |
1991 | } | 2055 | } |
1992 | 2056 | ||
1993 | static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) | 2057 | static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) |
1994 | { | 2058 | { |
1995 | struct host_cmd cmd = { | ||
1996 | .cmd = IPW_CMD_ADAPTER_ADDRESS, | ||
1997 | .len = ETH_ALEN | ||
1998 | }; | ||
1999 | |||
2000 | if (!priv || !mac) { | 2059 | if (!priv || !mac) { |
2001 | IPW_ERROR("Invalid args\n"); | 2060 | IPW_ERROR("Invalid args\n"); |
2002 | return -1; | 2061 | return -1; |
@@ -2005,8 +2064,7 @@ static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) | |||
2005 | IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n", | 2064 | IPW_DEBUG_INFO("%s: Setting MAC to " MAC_FMT "\n", |
2006 | priv->net_dev->name, MAC_ARG(mac)); | 2065 | priv->net_dev->name, MAC_ARG(mac)); |
2007 | 2066 | ||
2008 | memcpy(cmd.param, mac, ETH_ALEN); | 2067 | return ipw_send_cmd_pdu(priv, IPW_CMD_ADAPTER_ADDRESS, ETH_ALEN, mac); |
2009 | return ipw_send_cmd(priv, &cmd); | ||
2010 | } | 2068 | } |
2011 | 2069 | ||
2012 | /* | 2070 | /* |
@@ -2036,9 +2094,9 @@ static void ipw_adapter_restart(void *adapter) | |||
2036 | static void ipw_bg_adapter_restart(void *data) | 2094 | static void ipw_bg_adapter_restart(void *data) |
2037 | { | 2095 | { |
2038 | struct ipw_priv *priv = data; | 2096 | struct ipw_priv *priv = data; |
2039 | down(&priv->sem); | 2097 | mutex_lock(&priv->mutex); |
2040 | ipw_adapter_restart(data); | 2098 | ipw_adapter_restart(data); |
2041 | up(&priv->sem); | 2099 | mutex_unlock(&priv->mutex); |
2042 | } | 2100 | } |
2043 | 2101 | ||
2044 | #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ) | 2102 | #define IPW_SCAN_CHECK_WATCHDOG (5 * HZ) |
@@ -2048,8 +2106,8 @@ static void ipw_scan_check(void *data) | |||
2048 | struct ipw_priv *priv = data; | 2106 | struct ipw_priv *priv = data; |
2049 | if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) { | 2107 | if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) { |
2050 | IPW_DEBUG_SCAN("Scan completion watchdog resetting " | 2108 | IPW_DEBUG_SCAN("Scan completion watchdog resetting " |
2051 | "adapter (%dms).\n", | 2109 | "adapter after (%dms).\n", |
2052 | IPW_SCAN_CHECK_WATCHDOG / 100); | 2110 | jiffies_to_msecs(IPW_SCAN_CHECK_WATCHDOG)); |
2053 | queue_work(priv->workqueue, &priv->adapter_restart); | 2111 | queue_work(priv->workqueue, &priv->adapter_restart); |
2054 | } | 2112 | } |
2055 | } | 2113 | } |
@@ -2057,59 +2115,48 @@ static void ipw_scan_check(void *data) | |||
2057 | static void ipw_bg_scan_check(void *data) | 2115 | static void ipw_bg_scan_check(void *data) |
2058 | { | 2116 | { |
2059 | struct ipw_priv *priv = data; | 2117 | struct ipw_priv *priv = data; |
2060 | down(&priv->sem); | 2118 | mutex_lock(&priv->mutex); |
2061 | ipw_scan_check(data); | 2119 | ipw_scan_check(data); |
2062 | up(&priv->sem); | 2120 | mutex_unlock(&priv->mutex); |
2063 | } | 2121 | } |
2064 | 2122 | ||
2065 | static int ipw_send_scan_request_ext(struct ipw_priv *priv, | 2123 | static int ipw_send_scan_request_ext(struct ipw_priv *priv, |
2066 | struct ipw_scan_request_ext *request) | 2124 | struct ipw_scan_request_ext *request) |
2067 | { | 2125 | { |
2068 | struct host_cmd cmd = { | 2126 | return ipw_send_cmd_pdu(priv, IPW_CMD_SCAN_REQUEST_EXT, |
2069 | .cmd = IPW_CMD_SCAN_REQUEST_EXT, | 2127 | sizeof(*request), request); |
2070 | .len = sizeof(*request) | ||
2071 | }; | ||
2072 | |||
2073 | memcpy(cmd.param, request, sizeof(*request)); | ||
2074 | return ipw_send_cmd(priv, &cmd); | ||
2075 | } | 2128 | } |
2076 | 2129 | ||
2077 | static int ipw_send_scan_abort(struct ipw_priv *priv) | 2130 | static int ipw_send_scan_abort(struct ipw_priv *priv) |
2078 | { | 2131 | { |
2079 | struct host_cmd cmd = { | ||
2080 | .cmd = IPW_CMD_SCAN_ABORT, | ||
2081 | .len = 0 | ||
2082 | }; | ||
2083 | |||
2084 | if (!priv) { | 2132 | if (!priv) { |
2085 | IPW_ERROR("Invalid args\n"); | 2133 | IPW_ERROR("Invalid args\n"); |
2086 | return -1; | 2134 | return -1; |
2087 | } | 2135 | } |
2088 | 2136 | ||
2089 | return ipw_send_cmd(priv, &cmd); | 2137 | return ipw_send_cmd_simple(priv, IPW_CMD_SCAN_ABORT); |
2090 | } | 2138 | } |
2091 | 2139 | ||
2092 | static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens) | 2140 | static int ipw_set_sensitivity(struct ipw_priv *priv, u16 sens) |
2093 | { | 2141 | { |
2094 | struct host_cmd cmd = { | 2142 | struct ipw_sensitivity_calib calib = { |
2095 | .cmd = IPW_CMD_SENSITIVITY_CALIB, | 2143 | .beacon_rssi_raw = sens, |
2096 | .len = sizeof(struct ipw_sensitivity_calib) | ||
2097 | }; | 2144 | }; |
2098 | struct ipw_sensitivity_calib *calib = (struct ipw_sensitivity_calib *) | 2145 | |
2099 | &cmd.param; | 2146 | return ipw_send_cmd_pdu(priv, IPW_CMD_SENSITIVITY_CALIB, sizeof(calib), |
2100 | calib->beacon_rssi_raw = sens; | 2147 | &calib); |
2101 | return ipw_send_cmd(priv, &cmd); | ||
2102 | } | 2148 | } |
2103 | 2149 | ||
2104 | static int ipw_send_associate(struct ipw_priv *priv, | 2150 | static int ipw_send_associate(struct ipw_priv *priv, |
2105 | struct ipw_associate *associate) | 2151 | struct ipw_associate *associate) |
2106 | { | 2152 | { |
2107 | struct host_cmd cmd = { | ||
2108 | .cmd = IPW_CMD_ASSOCIATE, | ||
2109 | .len = sizeof(*associate) | ||
2110 | }; | ||
2111 | |||
2112 | struct ipw_associate tmp_associate; | 2153 | struct ipw_associate tmp_associate; |
2154 | |||
2155 | if (!priv || !associate) { | ||
2156 | IPW_ERROR("Invalid args\n"); | ||
2157 | return -1; | ||
2158 | } | ||
2159 | |||
2113 | memcpy(&tmp_associate, associate, sizeof(*associate)); | 2160 | memcpy(&tmp_associate, associate, sizeof(*associate)); |
2114 | tmp_associate.policy_support = | 2161 | tmp_associate.policy_support = |
2115 | cpu_to_le16(tmp_associate.policy_support); | 2162 | cpu_to_le16(tmp_associate.policy_support); |
@@ -2122,80 +2169,55 @@ static int ipw_send_associate(struct ipw_priv *priv, | |||
2122 | cpu_to_le16(tmp_associate.beacon_interval); | 2169 | cpu_to_le16(tmp_associate.beacon_interval); |
2123 | tmp_associate.atim_window = cpu_to_le16(tmp_associate.atim_window); | 2170 | tmp_associate.atim_window = cpu_to_le16(tmp_associate.atim_window); |
2124 | 2171 | ||
2125 | if (!priv || !associate) { | 2172 | return ipw_send_cmd_pdu(priv, IPW_CMD_ASSOCIATE, sizeof(tmp_associate), |
2126 | IPW_ERROR("Invalid args\n"); | 2173 | &tmp_associate); |
2127 | return -1; | ||
2128 | } | ||
2129 | |||
2130 | memcpy(cmd.param, &tmp_associate, sizeof(*associate)); | ||
2131 | return ipw_send_cmd(priv, &cmd); | ||
2132 | } | 2174 | } |
2133 | 2175 | ||
2134 | static int ipw_send_supported_rates(struct ipw_priv *priv, | 2176 | static int ipw_send_supported_rates(struct ipw_priv *priv, |
2135 | struct ipw_supported_rates *rates) | 2177 | struct ipw_supported_rates *rates) |
2136 | { | 2178 | { |
2137 | struct host_cmd cmd = { | ||
2138 | .cmd = IPW_CMD_SUPPORTED_RATES, | ||
2139 | .len = sizeof(*rates) | ||
2140 | }; | ||
2141 | |||
2142 | if (!priv || !rates) { | 2179 | if (!priv || !rates) { |
2143 | IPW_ERROR("Invalid args\n"); | 2180 | IPW_ERROR("Invalid args\n"); |
2144 | return -1; | 2181 | return -1; |
2145 | } | 2182 | } |
2146 | 2183 | ||
2147 | memcpy(cmd.param, rates, sizeof(*rates)); | 2184 | return ipw_send_cmd_pdu(priv, IPW_CMD_SUPPORTED_RATES, sizeof(*rates), |
2148 | return ipw_send_cmd(priv, &cmd); | 2185 | rates); |
2149 | } | 2186 | } |
2150 | 2187 | ||
2151 | static int ipw_set_random_seed(struct ipw_priv *priv) | 2188 | static int ipw_set_random_seed(struct ipw_priv *priv) |
2152 | { | 2189 | { |
2153 | struct host_cmd cmd = { | 2190 | u32 val; |
2154 | .cmd = IPW_CMD_SEED_NUMBER, | ||
2155 | .len = sizeof(u32) | ||
2156 | }; | ||
2157 | 2191 | ||
2158 | if (!priv) { | 2192 | if (!priv) { |
2159 | IPW_ERROR("Invalid args\n"); | 2193 | IPW_ERROR("Invalid args\n"); |
2160 | return -1; | 2194 | return -1; |
2161 | } | 2195 | } |
2162 | 2196 | ||
2163 | get_random_bytes(&cmd.param, sizeof(u32)); | 2197 | get_random_bytes(&val, sizeof(val)); |
2164 | 2198 | ||
2165 | return ipw_send_cmd(priv, &cmd); | 2199 | return ipw_send_cmd_pdu(priv, IPW_CMD_SEED_NUMBER, sizeof(val), &val); |
2166 | } | 2200 | } |
2167 | 2201 | ||
2168 | static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off) | 2202 | static int ipw_send_card_disable(struct ipw_priv *priv, u32 phy_off) |
2169 | { | 2203 | { |
2170 | struct host_cmd cmd = { | ||
2171 | .cmd = IPW_CMD_CARD_DISABLE, | ||
2172 | .len = sizeof(u32) | ||
2173 | }; | ||
2174 | |||
2175 | if (!priv) { | 2204 | if (!priv) { |
2176 | IPW_ERROR("Invalid args\n"); | 2205 | IPW_ERROR("Invalid args\n"); |
2177 | return -1; | 2206 | return -1; |
2178 | } | 2207 | } |
2179 | 2208 | ||
2180 | *((u32 *) & cmd.param) = phy_off; | 2209 | return ipw_send_cmd_pdu(priv, IPW_CMD_CARD_DISABLE, sizeof(phy_off), |
2181 | 2210 | &phy_off); | |
2182 | return ipw_send_cmd(priv, &cmd); | ||
2183 | } | 2211 | } |
2184 | 2212 | ||
2185 | static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) | 2213 | static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) |
2186 | { | 2214 | { |
2187 | struct host_cmd cmd = { | ||
2188 | .cmd = IPW_CMD_TX_POWER, | ||
2189 | .len = sizeof(*power) | ||
2190 | }; | ||
2191 | |||
2192 | if (!priv || !power) { | 2215 | if (!priv || !power) { |
2193 | IPW_ERROR("Invalid args\n"); | 2216 | IPW_ERROR("Invalid args\n"); |
2194 | return -1; | 2217 | return -1; |
2195 | } | 2218 | } |
2196 | 2219 | ||
2197 | memcpy(cmd.param, power, sizeof(*power)); | 2220 | return ipw_send_cmd_pdu(priv, IPW_CMD_TX_POWER, sizeof(*power), power); |
2198 | return ipw_send_cmd(priv, &cmd); | ||
2199 | } | 2221 | } |
2200 | 2222 | ||
2201 | static int ipw_set_tx_power(struct ipw_priv *priv) | 2223 | static int ipw_set_tx_power(struct ipw_priv *priv) |
@@ -2247,18 +2269,14 @@ static int ipw_send_rts_threshold(struct ipw_priv *priv, u16 rts) | |||
2247 | struct ipw_rts_threshold rts_threshold = { | 2269 | struct ipw_rts_threshold rts_threshold = { |
2248 | .rts_threshold = rts, | 2270 | .rts_threshold = rts, |
2249 | }; | 2271 | }; |
2250 | struct host_cmd cmd = { | ||
2251 | .cmd = IPW_CMD_RTS_THRESHOLD, | ||
2252 | .len = sizeof(rts_threshold) | ||
2253 | }; | ||
2254 | 2272 | ||
2255 | if (!priv) { | 2273 | if (!priv) { |
2256 | IPW_ERROR("Invalid args\n"); | 2274 | IPW_ERROR("Invalid args\n"); |
2257 | return -1; | 2275 | return -1; |
2258 | } | 2276 | } |
2259 | 2277 | ||
2260 | memcpy(cmd.param, &rts_threshold, sizeof(rts_threshold)); | 2278 | return ipw_send_cmd_pdu(priv, IPW_CMD_RTS_THRESHOLD, |
2261 | return ipw_send_cmd(priv, &cmd); | 2279 | sizeof(rts_threshold), &rts_threshold); |
2262 | } | 2280 | } |
2263 | 2281 | ||
2264 | static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) | 2282 | static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) |
@@ -2266,27 +2284,19 @@ static int ipw_send_frag_threshold(struct ipw_priv *priv, u16 frag) | |||
2266 | struct ipw_frag_threshold frag_threshold = { | 2284 | struct ipw_frag_threshold frag_threshold = { |
2267 | .frag_threshold = frag, | 2285 | .frag_threshold = frag, |
2268 | }; | 2286 | }; |
2269 | struct host_cmd cmd = { | ||
2270 | .cmd = IPW_CMD_FRAG_THRESHOLD, | ||
2271 | .len = sizeof(frag_threshold) | ||
2272 | }; | ||
2273 | 2287 | ||
2274 | if (!priv) { | 2288 | if (!priv) { |
2275 | IPW_ERROR("Invalid args\n"); | 2289 | IPW_ERROR("Invalid args\n"); |
2276 | return -1; | 2290 | return -1; |
2277 | } | 2291 | } |
2278 | 2292 | ||
2279 | memcpy(cmd.param, &frag_threshold, sizeof(frag_threshold)); | 2293 | return ipw_send_cmd_pdu(priv, IPW_CMD_FRAG_THRESHOLD, |
2280 | return ipw_send_cmd(priv, &cmd); | 2294 | sizeof(frag_threshold), &frag_threshold); |
2281 | } | 2295 | } |
2282 | 2296 | ||
2283 | static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) | 2297 | static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) |
2284 | { | 2298 | { |
2285 | struct host_cmd cmd = { | 2299 | u32 param; |
2286 | .cmd = IPW_CMD_POWER_MODE, | ||
2287 | .len = sizeof(u32) | ||
2288 | }; | ||
2289 | u32 *param = (u32 *) (&cmd.param); | ||
2290 | 2300 | ||
2291 | if (!priv) { | 2301 | if (!priv) { |
2292 | IPW_ERROR("Invalid args\n"); | 2302 | IPW_ERROR("Invalid args\n"); |
@@ -2297,17 +2307,18 @@ static int ipw_send_power_mode(struct ipw_priv *priv, u32 mode) | |||
2297 | * level */ | 2307 | * level */ |
2298 | switch (mode) { | 2308 | switch (mode) { |
2299 | case IPW_POWER_BATTERY: | 2309 | case IPW_POWER_BATTERY: |
2300 | *param = IPW_POWER_INDEX_3; | 2310 | param = IPW_POWER_INDEX_3; |
2301 | break; | 2311 | break; |
2302 | case IPW_POWER_AC: | 2312 | case IPW_POWER_AC: |
2303 | *param = IPW_POWER_MODE_CAM; | 2313 | param = IPW_POWER_MODE_CAM; |
2304 | break; | 2314 | break; |
2305 | default: | 2315 | default: |
2306 | *param = mode; | 2316 | param = mode; |
2307 | break; | 2317 | break; |
2308 | } | 2318 | } |
2309 | 2319 | ||
2310 | return ipw_send_cmd(priv, &cmd); | 2320 | return ipw_send_cmd_pdu(priv, IPW_CMD_POWER_MODE, sizeof(param), |
2321 | ¶m); | ||
2311 | } | 2322 | } |
2312 | 2323 | ||
2313 | static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit) | 2324 | static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit) |
@@ -2316,18 +2327,14 @@ static int ipw_send_retry_limit(struct ipw_priv *priv, u8 slimit, u8 llimit) | |||
2316 | .short_retry_limit = slimit, | 2327 | .short_retry_limit = slimit, |
2317 | .long_retry_limit = llimit | 2328 | .long_retry_limit = llimit |
2318 | }; | 2329 | }; |
2319 | struct host_cmd cmd = { | ||
2320 | .cmd = IPW_CMD_RETRY_LIMIT, | ||
2321 | .len = sizeof(retry_limit) | ||
2322 | }; | ||
2323 | 2330 | ||
2324 | if (!priv) { | 2331 | if (!priv) { |
2325 | IPW_ERROR("Invalid args\n"); | 2332 | IPW_ERROR("Invalid args\n"); |
2326 | return -1; | 2333 | return -1; |
2327 | } | 2334 | } |
2328 | 2335 | ||
2329 | memcpy(cmd.param, &retry_limit, sizeof(retry_limit)); | 2336 | return ipw_send_cmd_pdu(priv, IPW_CMD_RETRY_LIMIT, sizeof(retry_limit), |
2330 | return ipw_send_cmd(priv, &cmd); | 2337 | &retry_limit); |
2331 | } | 2338 | } |
2332 | 2339 | ||
2333 | /* | 2340 | /* |
@@ -2454,7 +2461,7 @@ static void ipw_eeprom_init_sram(struct ipw_priv *priv) | |||
2454 | /* | 2461 | /* |
2455 | If the data looks correct, then copy it to our private | 2462 | If the data looks correct, then copy it to our private |
2456 | copy. Otherwise let the firmware know to perform the operation | 2463 | copy. Otherwise let the firmware know to perform the operation |
2457 | on it's own | 2464 | on its own. |
2458 | */ | 2465 | */ |
2459 | if (priv->eeprom[EEPROM_VERSION] != 0) { | 2466 | if (priv->eeprom[EEPROM_VERSION] != 0) { |
2460 | IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n"); | 2467 | IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n"); |
@@ -2707,22 +2714,25 @@ static int ipw_fw_dma_add_buffer(struct ipw_priv *priv, | |||
2707 | 2714 | ||
2708 | static int ipw_fw_dma_wait(struct ipw_priv *priv) | 2715 | static int ipw_fw_dma_wait(struct ipw_priv *priv) |
2709 | { | 2716 | { |
2710 | u32 current_index = 0; | 2717 | u32 current_index = 0, previous_index; |
2711 | u32 watchdog = 0; | 2718 | u32 watchdog = 0; |
2712 | 2719 | ||
2713 | IPW_DEBUG_FW(">> : \n"); | 2720 | IPW_DEBUG_FW(">> : \n"); |
2714 | 2721 | ||
2715 | current_index = ipw_fw_dma_command_block_index(priv); | 2722 | current_index = ipw_fw_dma_command_block_index(priv); |
2716 | IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%8X\n", | 2723 | IPW_DEBUG_FW_INFO("sram_desc.last_cb_index:0x%08X\n", |
2717 | (int)priv->sram_desc.last_cb_index); | 2724 | (int)priv->sram_desc.last_cb_index); |
2718 | 2725 | ||
2719 | while (current_index < priv->sram_desc.last_cb_index) { | 2726 | while (current_index < priv->sram_desc.last_cb_index) { |
2720 | udelay(50); | 2727 | udelay(50); |
2728 | previous_index = current_index; | ||
2721 | current_index = ipw_fw_dma_command_block_index(priv); | 2729 | current_index = ipw_fw_dma_command_block_index(priv); |
2722 | 2730 | ||
2723 | watchdog++; | 2731 | if (previous_index < current_index) { |
2724 | 2732 | watchdog = 0; | |
2725 | if (watchdog > 400) { | 2733 | continue; |
2734 | } | ||
2735 | if (++watchdog > 400) { | ||
2726 | IPW_DEBUG_FW_INFO("Timeout\n"); | 2736 | IPW_DEBUG_FW_INFO("Timeout\n"); |
2727 | ipw_fw_dma_dump_command_block(priv); | 2737 | ipw_fw_dma_dump_command_block(priv); |
2728 | ipw_fw_dma_abort(priv); | 2738 | ipw_fw_dma_abort(priv); |
@@ -2772,6 +2782,7 @@ static inline int ipw_alive(struct ipw_priv *priv) | |||
2772 | return ipw_read32(priv, 0x90) == 0xd55555d5; | 2782 | return ipw_read32(priv, 0x90) == 0xd55555d5; |
2773 | } | 2783 | } |
2774 | 2784 | ||
2785 | /* timeout in msec, attempted in 10-msec quanta */ | ||
2775 | static int ipw_poll_bit(struct ipw_priv *priv, u32 addr, u32 mask, | 2786 | static int ipw_poll_bit(struct ipw_priv *priv, u32 addr, u32 mask, |
2776 | int timeout) | 2787 | int timeout) |
2777 | { | 2788 | { |
@@ -2800,10 +2811,11 @@ static int ipw_stop_master(struct ipw_priv *priv) | |||
2800 | /* stop master. typical delay - 0 */ | 2811 | /* stop master. typical delay - 0 */ |
2801 | ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER); | 2812 | ipw_set_bit(priv, IPW_RESET_REG, IPW_RESET_REG_STOP_MASTER); |
2802 | 2813 | ||
2814 | /* timeout is in msec, polled in 10-msec quanta */ | ||
2803 | rc = ipw_poll_bit(priv, IPW_RESET_REG, | 2815 | rc = ipw_poll_bit(priv, IPW_RESET_REG, |
2804 | IPW_RESET_REG_MASTER_DISABLED, 100); | 2816 | IPW_RESET_REG_MASTER_DISABLED, 100); |
2805 | if (rc < 0) { | 2817 | if (rc < 0) { |
2806 | IPW_ERROR("stop master failed in 10ms\n"); | 2818 | IPW_ERROR("wait for stop master failed after 100ms\n"); |
2807 | return -1; | 2819 | return -1; |
2808 | } | 2820 | } |
2809 | 2821 | ||
@@ -2890,8 +2902,8 @@ static int ipw_load_ucode(struct ipw_priv *priv, u8 * data, size_t len) | |||
2890 | mdelay(1); | 2902 | mdelay(1); |
2891 | 2903 | ||
2892 | /* enable ucode store */ | 2904 | /* enable ucode store */ |
2893 | ipw_write_reg8(priv, DINO_CONTROL_REG, 0x0); | 2905 | ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, 0x0); |
2894 | ipw_write_reg8(priv, DINO_CONTROL_REG, DINO_ENABLE_CS); | 2906 | ipw_write_reg8(priv, IPW_BASEBAND_CONTROL_STATUS, DINO_ENABLE_CS); |
2895 | mdelay(1); | 2907 | mdelay(1); |
2896 | 2908 | ||
2897 | /* write ucode */ | 2909 | /* write ucode */ |
@@ -3036,7 +3048,7 @@ static int ipw_stop_nic(struct ipw_priv *priv) | |||
3036 | rc = ipw_poll_bit(priv, IPW_RESET_REG, | 3048 | rc = ipw_poll_bit(priv, IPW_RESET_REG, |
3037 | IPW_RESET_REG_MASTER_DISABLED, 500); | 3049 | IPW_RESET_REG_MASTER_DISABLED, 500); |
3038 | if (rc < 0) { | 3050 | if (rc < 0) { |
3039 | IPW_ERROR("wait for reg master disabled failed\n"); | 3051 | IPW_ERROR("wait for reg master disabled failed after 500ms\n"); |
3040 | return rc; | 3052 | return rc; |
3041 | } | 3053 | } |
3042 | 3054 | ||
@@ -3209,55 +3221,31 @@ static int ipw_load(struct ipw_priv *priv) | |||
3209 | const struct firmware *firmware = NULL; | 3221 | const struct firmware *firmware = NULL; |
3210 | const struct firmware *ucode = NULL; | 3222 | const struct firmware *ucode = NULL; |
3211 | #endif | 3223 | #endif |
3224 | char *ucode_name; | ||
3225 | char *fw_name; | ||
3212 | int rc = 0, retries = 3; | 3226 | int rc = 0, retries = 3; |
3213 | 3227 | ||
3214 | #ifdef CONFIG_PM | 3228 | switch (priv->ieee->iw_mode) { |
3215 | if (!fw_loaded) { | 3229 | case IW_MODE_ADHOC: |
3216 | #endif | 3230 | ucode_name = IPW_FW_NAME("ibss_ucode"); |
3217 | rc = ipw_get_fw(priv, &bootfw, IPW_FW_NAME("boot")); | 3231 | fw_name = IPW_FW_NAME("ibss"); |
3218 | if (rc) | 3232 | break; |
3219 | goto error; | ||
3220 | |||
3221 | switch (priv->ieee->iw_mode) { | ||
3222 | case IW_MODE_ADHOC: | ||
3223 | rc = ipw_get_fw(priv, &ucode, | ||
3224 | IPW_FW_NAME("ibss_ucode")); | ||
3225 | if (rc) | ||
3226 | goto error; | ||
3227 | |||
3228 | rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("ibss")); | ||
3229 | break; | ||
3230 | |||
3231 | #ifdef CONFIG_IPW2200_MONITOR | 3233 | #ifdef CONFIG_IPW2200_MONITOR |
3232 | case IW_MODE_MONITOR: | 3234 | case IW_MODE_MONITOR: |
3233 | rc = ipw_get_fw(priv, &ucode, | 3235 | ucode_name = IPW_FW_NAME("sniffer_ucode"); |
3234 | IPW_FW_NAME("sniffer_ucode")); | 3236 | fw_name = IPW_FW_NAME("sniffer"); |
3235 | if (rc) | 3237 | break; |
3236 | goto error; | ||
3237 | |||
3238 | rc = ipw_get_fw(priv, &firmware, | ||
3239 | IPW_FW_NAME("sniffer")); | ||
3240 | break; | ||
3241 | #endif | 3238 | #endif |
3242 | case IW_MODE_INFRA: | 3239 | case IW_MODE_INFRA: |
3243 | rc = ipw_get_fw(priv, &ucode, IPW_FW_NAME("bss_ucode")); | 3240 | ucode_name = IPW_FW_NAME("bss_ucode"); |
3244 | if (rc) | 3241 | fw_name = IPW_FW_NAME("bss"); |
3245 | goto error; | 3242 | break; |
3246 | 3243 | default: | |
3247 | rc = ipw_get_fw(priv, &firmware, IPW_FW_NAME("bss")); | 3244 | rc = -EINVAL; |
3248 | break; | ||
3249 | |||
3250 | default: | ||
3251 | rc = -EINVAL; | ||
3252 | } | ||
3253 | |||
3254 | if (rc) | ||
3255 | goto error; | ||
3256 | |||
3257 | #ifdef CONFIG_PM | ||
3258 | fw_loaded = 1; | ||
3259 | } | 3245 | } |
3260 | #endif | 3246 | |
3247 | if (rc < 0) | ||
3248 | goto error; | ||
3261 | 3249 | ||
3262 | if (!priv->rxq) | 3250 | if (!priv->rxq) |
3263 | priv->rxq = ipw_rx_queue_alloc(priv); | 3251 | priv->rxq = ipw_rx_queue_alloc(priv); |
@@ -3279,7 +3267,7 @@ static int ipw_load(struct ipw_priv *priv) | |||
3279 | ipw_stop_nic(priv); | 3267 | ipw_stop_nic(priv); |
3280 | 3268 | ||
3281 | rc = ipw_reset_nic(priv); | 3269 | rc = ipw_reset_nic(priv); |
3282 | if (rc) { | 3270 | if (rc < 0) { |
3283 | IPW_ERROR("Unable to reset NIC\n"); | 3271 | IPW_ERROR("Unable to reset NIC\n"); |
3284 | goto error; | 3272 | goto error; |
3285 | } | 3273 | } |
@@ -3287,6 +3275,15 @@ static int ipw_load(struct ipw_priv *priv) | |||
3287 | ipw_zero_memory(priv, IPW_NIC_SRAM_LOWER_BOUND, | 3275 | ipw_zero_memory(priv, IPW_NIC_SRAM_LOWER_BOUND, |
3288 | IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND); | 3276 | IPW_NIC_SRAM_UPPER_BOUND - IPW_NIC_SRAM_LOWER_BOUND); |
3289 | 3277 | ||
3278 | #ifdef CONFIG_PM | ||
3279 | if (!fw_loaded) { | ||
3280 | #endif | ||
3281 | rc = ipw_get_fw(priv, &bootfw, IPW_FW_NAME("boot")); | ||
3282 | if (rc < 0) | ||
3283 | goto error; | ||
3284 | #ifdef CONFIG_PM | ||
3285 | } | ||
3286 | #endif | ||
3290 | /* DMA the initial boot firmware into the device */ | 3287 | /* DMA the initial boot firmware into the device */ |
3291 | rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header), | 3288 | rc = ipw_load_firmware(priv, bootfw->data + sizeof(struct fw_header), |
3292 | bootfw->size - sizeof(struct fw_header)); | 3289 | bootfw->size - sizeof(struct fw_header)); |
@@ -3298,7 +3295,7 @@ static int ipw_load(struct ipw_priv *priv) | |||
3298 | /* kick start the device */ | 3295 | /* kick start the device */ |
3299 | ipw_start_nic(priv); | 3296 | ipw_start_nic(priv); |
3300 | 3297 | ||
3301 | /* wait for the device to finish it's initial startup sequence */ | 3298 | /* wait for the device to finish its initial startup sequence */ |
3302 | rc = ipw_poll_bit(priv, IPW_INTA_RW, | 3299 | rc = ipw_poll_bit(priv, IPW_INTA_RW, |
3303 | IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500); | 3300 | IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500); |
3304 | if (rc < 0) { | 3301 | if (rc < 0) { |
@@ -3310,6 +3307,16 @@ static int ipw_load(struct ipw_priv *priv) | |||
3310 | /* ack fw init done interrupt */ | 3307 | /* ack fw init done interrupt */ |
3311 | ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE); | 3308 | ipw_write32(priv, IPW_INTA_RW, IPW_INTA_BIT_FW_INITIALIZATION_DONE); |
3312 | 3309 | ||
3310 | #ifdef CONFIG_PM | ||
3311 | if (!fw_loaded) { | ||
3312 | #endif | ||
3313 | rc = ipw_get_fw(priv, &ucode, ucode_name); | ||
3314 | if (rc < 0) | ||
3315 | goto error; | ||
3316 | #ifdef CONFIG_PM | ||
3317 | } | ||
3318 | #endif | ||
3319 | |||
3313 | /* DMA the ucode into the device */ | 3320 | /* DMA the ucode into the device */ |
3314 | rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header), | 3321 | rc = ipw_load_ucode(priv, ucode->data + sizeof(struct fw_header), |
3315 | ucode->size - sizeof(struct fw_header)); | 3322 | ucode->size - sizeof(struct fw_header)); |
@@ -3321,6 +3328,16 @@ static int ipw_load(struct ipw_priv *priv) | |||
3321 | /* stop nic */ | 3328 | /* stop nic */ |
3322 | ipw_stop_nic(priv); | 3329 | ipw_stop_nic(priv); |
3323 | 3330 | ||
3331 | #ifdef CONFIG_PM | ||
3332 | if (!fw_loaded) { | ||
3333 | #endif | ||
3334 | rc = ipw_get_fw(priv, &firmware, fw_name); | ||
3335 | if (rc < 0) | ||
3336 | goto error; | ||
3337 | #ifdef CONFIG_PM | ||
3338 | } | ||
3339 | #endif | ||
3340 | |||
3324 | /* DMA bss firmware into the device */ | 3341 | /* DMA bss firmware into the device */ |
3325 | rc = ipw_load_firmware(priv, firmware->data + | 3342 | rc = ipw_load_firmware(priv, firmware->data + |
3326 | sizeof(struct fw_header), | 3343 | sizeof(struct fw_header), |
@@ -3329,11 +3346,14 @@ static int ipw_load(struct ipw_priv *priv) | |||
3329 | IPW_ERROR("Unable to load firmware: %d\n", rc); | 3346 | IPW_ERROR("Unable to load firmware: %d\n", rc); |
3330 | goto error; | 3347 | goto error; |
3331 | } | 3348 | } |
3349 | #ifdef CONFIG_PM | ||
3350 | fw_loaded = 1; | ||
3351 | #endif | ||
3332 | 3352 | ||
3333 | ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0); | 3353 | ipw_write32(priv, IPW_EEPROM_LOAD_DISABLE, 0); |
3334 | 3354 | ||
3335 | rc = ipw_queue_reset(priv); | 3355 | rc = ipw_queue_reset(priv); |
3336 | if (rc) { | 3356 | if (rc < 0) { |
3337 | IPW_ERROR("Unable to initialize queues\n"); | 3357 | IPW_ERROR("Unable to initialize queues\n"); |
3338 | goto error; | 3358 | goto error; |
3339 | } | 3359 | } |
@@ -3362,7 +3382,7 @@ static int ipw_load(struct ipw_priv *priv) | |||
3362 | rc = ipw_poll_bit(priv, IPW_INTA_RW, | 3382 | rc = ipw_poll_bit(priv, IPW_INTA_RW, |
3363 | IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500); | 3383 | IPW_INTA_BIT_FW_INITIALIZATION_DONE, 500); |
3364 | if (rc < 0) { | 3384 | if (rc < 0) { |
3365 | IPW_ERROR("device failed to start after 500ms\n"); | 3385 | IPW_ERROR("device failed to start within 500ms\n"); |
3366 | goto error; | 3386 | goto error; |
3367 | } | 3387 | } |
3368 | IPW_DEBUG_INFO("device response after %dms\n", rc); | 3388 | IPW_DEBUG_INFO("device response after %dms\n", rc); |
@@ -3715,9 +3735,9 @@ static int ipw_disassociate(void *data) | |||
3715 | static void ipw_bg_disassociate(void *data) | 3735 | static void ipw_bg_disassociate(void *data) |
3716 | { | 3736 | { |
3717 | struct ipw_priv *priv = data; | 3737 | struct ipw_priv *priv = data; |
3718 | down(&priv->sem); | 3738 | mutex_lock(&priv->mutex); |
3719 | ipw_disassociate(data); | 3739 | ipw_disassociate(data); |
3720 | up(&priv->sem); | 3740 | mutex_unlock(&priv->mutex); |
3721 | } | 3741 | } |
3722 | 3742 | ||
3723 | static void ipw_system_config(void *data) | 3743 | static void ipw_system_config(void *data) |
@@ -4077,9 +4097,9 @@ static void ipw_gather_stats(struct ipw_priv *priv) | |||
4077 | static void ipw_bg_gather_stats(void *data) | 4097 | static void ipw_bg_gather_stats(void *data) |
4078 | { | 4098 | { |
4079 | struct ipw_priv *priv = data; | 4099 | struct ipw_priv *priv = data; |
4080 | down(&priv->sem); | 4100 | mutex_lock(&priv->mutex); |
4081 | ipw_gather_stats(data); | 4101 | ipw_gather_stats(data); |
4082 | up(&priv->sem); | 4102 | mutex_unlock(&priv->mutex); |
4083 | } | 4103 | } |
4084 | 4104 | ||
4085 | /* Missed beacon behavior: | 4105 | /* Missed beacon behavior: |
@@ -4121,8 +4141,9 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv, | |||
4121 | return; | 4141 | return; |
4122 | } | 4142 | } |
4123 | 4143 | ||
4124 | if (missed_count > priv->roaming_threshold && | 4144 | if (roaming && |
4125 | missed_count <= priv->disassociate_threshold) { | 4145 | (missed_count > priv->roaming_threshold && |
4146 | missed_count <= priv->disassociate_threshold)) { | ||
4126 | /* If we are not already roaming, set the ROAM | 4147 | /* If we are not already roaming, set the ROAM |
4127 | * bit in the status and kick off a scan. | 4148 | * bit in the status and kick off a scan. |
4128 | * This can happen several times before we reach | 4149 | * This can happen several times before we reach |
@@ -4150,7 +4171,6 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv, | |||
4150 | } | 4171 | } |
4151 | 4172 | ||
4152 | IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count); | 4173 | IPW_DEBUG_NOTIF("Missed beacon: %d\n", missed_count); |
4153 | |||
4154 | } | 4174 | } |
4155 | 4175 | ||
4156 | /** | 4176 | /** |
@@ -4911,13 +4931,13 @@ static void ipw_rx_queue_replenish(void *data) | |||
4911 | static void ipw_bg_rx_queue_replenish(void *data) | 4931 | static void ipw_bg_rx_queue_replenish(void *data) |
4912 | { | 4932 | { |
4913 | struct ipw_priv *priv = data; | 4933 | struct ipw_priv *priv = data; |
4914 | down(&priv->sem); | 4934 | mutex_lock(&priv->mutex); |
4915 | ipw_rx_queue_replenish(data); | 4935 | ipw_rx_queue_replenish(data); |
4916 | up(&priv->sem); | 4936 | mutex_unlock(&priv->mutex); |
4917 | } | 4937 | } |
4918 | 4938 | ||
4919 | /* Assumes that the skb field of the buffers in 'pool' is kept accurate. | 4939 | /* Assumes that the skb field of the buffers in 'pool' is kept accurate. |
4920 | * If an SKB has been detached, the POOL needs to have it's SKB set to NULL | 4940 | * If an SKB has been detached, the POOL needs to have its SKB set to NULL |
4921 | * This free routine walks the list of POOL entries and if SKB is set to | 4941 | * This free routine walks the list of POOL entries and if SKB is set to |
4922 | * non NULL it is unmapped and freed | 4942 | * non NULL it is unmapped and freed |
4923 | */ | 4943 | */ |
@@ -5257,10 +5277,11 @@ static int ipw_find_adhoc_network(struct ipw_priv *priv, | |||
5257 | if (priv->ieee->scan_age != 0 && | 5277 | if (priv->ieee->scan_age != 0 && |
5258 | time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { | 5278 | time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { |
5259 | IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded " | 5279 | IPW_DEBUG_MERGE("Network '%s (" MAC_FMT ")' excluded " |
5260 | "because of age: %lums.\n", | 5280 | "because of age: %ums.\n", |
5261 | escape_essid(network->ssid, network->ssid_len), | 5281 | escape_essid(network->ssid, network->ssid_len), |
5262 | MAC_ARG(network->bssid), | 5282 | MAC_ARG(network->bssid), |
5263 | 1000 * (jiffies - network->last_scanned) / HZ); | 5283 | jiffies_to_msecs(jiffies - |
5284 | network->last_scanned)); | ||
5264 | return 0; | 5285 | return 0; |
5265 | } | 5286 | } |
5266 | 5287 | ||
@@ -5369,7 +5390,7 @@ static void ipw_merge_adhoc_network(void *data) | |||
5369 | return; | 5390 | return; |
5370 | } | 5391 | } |
5371 | 5392 | ||
5372 | down(&priv->sem); | 5393 | mutex_lock(&priv->mutex); |
5373 | if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) { | 5394 | if ((priv->ieee->iw_mode == IW_MODE_ADHOC)) { |
5374 | IPW_DEBUG_MERGE("remove network %s\n", | 5395 | IPW_DEBUG_MERGE("remove network %s\n", |
5375 | escape_essid(priv->essid, | 5396 | escape_essid(priv->essid, |
@@ -5379,7 +5400,7 @@ static void ipw_merge_adhoc_network(void *data) | |||
5379 | 5400 | ||
5380 | ipw_disassociate(priv); | 5401 | ipw_disassociate(priv); |
5381 | priv->assoc_network = match.network; | 5402 | priv->assoc_network = match.network; |
5382 | up(&priv->sem); | 5403 | mutex_unlock(&priv->mutex); |
5383 | return; | 5404 | return; |
5384 | } | 5405 | } |
5385 | } | 5406 | } |
@@ -5467,11 +5488,12 @@ static int ipw_best_network(struct ipw_priv *priv, | |||
5467 | if (network->last_associate && | 5488 | if (network->last_associate && |
5468 | time_after(network->last_associate + (HZ * 3UL), jiffies)) { | 5489 | time_after(network->last_associate + (HZ * 3UL), jiffies)) { |
5469 | IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " | 5490 | IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " |
5470 | "because of storming (%lus since last " | 5491 | "because of storming (%ums since last " |
5471 | "assoc attempt).\n", | 5492 | "assoc attempt).\n", |
5472 | escape_essid(network->ssid, network->ssid_len), | 5493 | escape_essid(network->ssid, network->ssid_len), |
5473 | MAC_ARG(network->bssid), | 5494 | MAC_ARG(network->bssid), |
5474 | (jiffies - network->last_associate) / HZ); | 5495 | jiffies_to_msecs(jiffies - |
5496 | network->last_associate)); | ||
5475 | return 0; | 5497 | return 0; |
5476 | } | 5498 | } |
5477 | 5499 | ||
@@ -5479,10 +5501,11 @@ static int ipw_best_network(struct ipw_priv *priv, | |||
5479 | if (priv->ieee->scan_age != 0 && | 5501 | if (priv->ieee->scan_age != 0 && |
5480 | time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { | 5502 | time_after(jiffies, network->last_scanned + priv->ieee->scan_age)) { |
5481 | IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " | 5503 | IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " |
5482 | "because of age: %lums.\n", | 5504 | "because of age: %ums.\n", |
5483 | escape_essid(network->ssid, network->ssid_len), | 5505 | escape_essid(network->ssid, network->ssid_len), |
5484 | MAC_ARG(network->bssid), | 5506 | MAC_ARG(network->bssid), |
5485 | 1000 * (jiffies - network->last_scanned) / HZ); | 5507 | jiffies_to_msecs(jiffies - |
5508 | network->last_scanned)); | ||
5486 | return 0; | 5509 | return 0; |
5487 | } | 5510 | } |
5488 | 5511 | ||
@@ -5671,54 +5694,44 @@ static void ipw_adhoc_create(struct ipw_priv *priv, | |||
5671 | 5694 | ||
5672 | static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index) | 5695 | static void ipw_send_tgi_tx_key(struct ipw_priv *priv, int type, int index) |
5673 | { | 5696 | { |
5674 | struct ipw_tgi_tx_key *key; | 5697 | struct ipw_tgi_tx_key key; |
5675 | struct host_cmd cmd = { | ||
5676 | .cmd = IPW_CMD_TGI_TX_KEY, | ||
5677 | .len = sizeof(*key) | ||
5678 | }; | ||
5679 | 5698 | ||
5680 | if (!(priv->ieee->sec.flags & (1 << index))) | 5699 | if (!(priv->ieee->sec.flags & (1 << index))) |
5681 | return; | 5700 | return; |
5682 | 5701 | ||
5683 | key = (struct ipw_tgi_tx_key *)&cmd.param; | 5702 | key.key_id = index; |
5684 | key->key_id = index; | 5703 | memcpy(key.key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH); |
5685 | memcpy(key->key, priv->ieee->sec.keys[index], SCM_TEMPORAL_KEY_LENGTH); | 5704 | key.security_type = type; |
5686 | key->security_type = type; | 5705 | key.station_index = 0; /* always 0 for BSS */ |
5687 | key->station_index = 0; /* always 0 for BSS */ | 5706 | key.flags = 0; |
5688 | key->flags = 0; | ||
5689 | /* 0 for new key; previous value of counter (after fatal error) */ | 5707 | /* 0 for new key; previous value of counter (after fatal error) */ |
5690 | key->tx_counter[0] = 0; | 5708 | key.tx_counter[0] = 0; |
5691 | key->tx_counter[1] = 0; | 5709 | key.tx_counter[1] = 0; |
5692 | 5710 | ||
5693 | ipw_send_cmd(priv, &cmd); | 5711 | ipw_send_cmd_pdu(priv, IPW_CMD_TGI_TX_KEY, sizeof(key), &key); |
5694 | } | 5712 | } |
5695 | 5713 | ||
5696 | static void ipw_send_wep_keys(struct ipw_priv *priv, int type) | 5714 | static void ipw_send_wep_keys(struct ipw_priv *priv, int type) |
5697 | { | 5715 | { |
5698 | struct ipw_wep_key *key; | 5716 | struct ipw_wep_key key; |
5699 | int i; | 5717 | int i; |
5700 | struct host_cmd cmd = { | ||
5701 | .cmd = IPW_CMD_WEP_KEY, | ||
5702 | .len = sizeof(*key) | ||
5703 | }; | ||
5704 | 5718 | ||
5705 | key = (struct ipw_wep_key *)&cmd.param; | 5719 | key.cmd_id = DINO_CMD_WEP_KEY; |
5706 | key->cmd_id = DINO_CMD_WEP_KEY; | 5720 | key.seq_num = 0; |
5707 | key->seq_num = 0; | ||
5708 | 5721 | ||
5709 | /* Note: AES keys cannot be set for multiple times. | 5722 | /* Note: AES keys cannot be set for multiple times. |
5710 | * Only set it at the first time. */ | 5723 | * Only set it at the first time. */ |
5711 | for (i = 0; i < 4; i++) { | 5724 | for (i = 0; i < 4; i++) { |
5712 | key->key_index = i | type; | 5725 | key.key_index = i | type; |
5713 | if (!(priv->ieee->sec.flags & (1 << i))) { | 5726 | if (!(priv->ieee->sec.flags & (1 << i))) { |
5714 | key->key_size = 0; | 5727 | key.key_size = 0; |
5715 | continue; | 5728 | continue; |
5716 | } | 5729 | } |
5717 | 5730 | ||
5718 | key->key_size = priv->ieee->sec.key_sizes[i]; | 5731 | key.key_size = priv->ieee->sec.key_sizes[i]; |
5719 | memcpy(key->key, priv->ieee->sec.keys[i], key->key_size); | 5732 | memcpy(key.key, priv->ieee->sec.keys[i], key.key_size); |
5720 | 5733 | ||
5721 | ipw_send_cmd(priv, &cmd); | 5734 | ipw_send_cmd_pdu(priv, IPW_CMD_WEP_KEY, sizeof(key), &key); |
5722 | } | 5735 | } |
5723 | } | 5736 | } |
5724 | 5737 | ||
@@ -5822,9 +5835,9 @@ static void ipw_adhoc_check(void *data) | |||
5822 | static void ipw_bg_adhoc_check(void *data) | 5835 | static void ipw_bg_adhoc_check(void *data) |
5823 | { | 5836 | { |
5824 | struct ipw_priv *priv = data; | 5837 | struct ipw_priv *priv = data; |
5825 | down(&priv->sem); | 5838 | mutex_lock(&priv->mutex); |
5826 | ipw_adhoc_check(data); | 5839 | ipw_adhoc_check(data); |
5827 | up(&priv->sem); | 5840 | mutex_unlock(&priv->mutex); |
5828 | } | 5841 | } |
5829 | 5842 | ||
5830 | #ifdef CONFIG_IPW2200_DEBUG | 5843 | #ifdef CONFIG_IPW2200_DEBUG |
@@ -6051,7 +6064,7 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
6051 | (priv->status & STATUS_EXIT_PENDING)) | 6064 | (priv->status & STATUS_EXIT_PENDING)) |
6052 | return 0; | 6065 | return 0; |
6053 | 6066 | ||
6054 | down(&priv->sem); | 6067 | mutex_lock(&priv->mutex); |
6055 | 6068 | ||
6056 | if (priv->status & STATUS_SCANNING) { | 6069 | if (priv->status & STATUS_SCANNING) { |
6057 | IPW_DEBUG_HC("Concurrent scan requested. Ignoring.\n"); | 6070 | IPW_DEBUG_HC("Concurrent scan requested. Ignoring.\n"); |
@@ -6159,16 +6172,16 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
6159 | queue_delayed_work(priv->workqueue, &priv->scan_check, | 6172 | queue_delayed_work(priv->workqueue, &priv->scan_check, |
6160 | IPW_SCAN_CHECK_WATCHDOG); | 6173 | IPW_SCAN_CHECK_WATCHDOG); |
6161 | done: | 6174 | done: |
6162 | up(&priv->sem); | 6175 | mutex_unlock(&priv->mutex); |
6163 | return err; | 6176 | return err; |
6164 | } | 6177 | } |
6165 | 6178 | ||
6166 | static void ipw_bg_abort_scan(void *data) | 6179 | static void ipw_bg_abort_scan(void *data) |
6167 | { | 6180 | { |
6168 | struct ipw_priv *priv = data; | 6181 | struct ipw_priv *priv = data; |
6169 | down(&priv->sem); | 6182 | mutex_lock(&priv->mutex); |
6170 | ipw_abort_scan(data); | 6183 | ipw_abort_scan(data); |
6171 | up(&priv->sem); | 6184 | mutex_unlock(&priv->mutex); |
6172 | } | 6185 | } |
6173 | 6186 | ||
6174 | static int ipw_wpa_enable(struct ipw_priv *priv, int value) | 6187 | static int ipw_wpa_enable(struct ipw_priv *priv, int value) |
@@ -6193,6 +6206,9 @@ static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value) | |||
6193 | } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { | 6206 | } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) { |
6194 | sec.auth_mode = WLAN_AUTH_OPEN; | 6207 | sec.auth_mode = WLAN_AUTH_OPEN; |
6195 | ieee->open_wep = 1; | 6208 | ieee->open_wep = 1; |
6209 | } else if (value & IW_AUTH_ALG_LEAP) { | ||
6210 | sec.auth_mode = WLAN_AUTH_LEAP; | ||
6211 | ieee->open_wep = 1; | ||
6196 | } else | 6212 | } else |
6197 | return -EINVAL; | 6213 | return -EINVAL; |
6198 | 6214 | ||
@@ -6204,7 +6220,8 @@ static int ipw_wpa_set_auth_algs(struct ipw_priv *priv, int value) | |||
6204 | return ret; | 6220 | return ret; |
6205 | } | 6221 | } |
6206 | 6222 | ||
6207 | void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, int wpa_ie_len) | 6223 | static void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, |
6224 | int wpa_ie_len) | ||
6208 | { | 6225 | { |
6209 | /* make sure WPA is enabled */ | 6226 | /* make sure WPA is enabled */ |
6210 | ipw_wpa_enable(priv, 1); | 6227 | ipw_wpa_enable(priv, 1); |
@@ -6215,15 +6232,10 @@ void ipw_wpa_assoc_frame(struct ipw_priv *priv, char *wpa_ie, int wpa_ie_len) | |||
6215 | static int ipw_set_rsn_capa(struct ipw_priv *priv, | 6232 | static int ipw_set_rsn_capa(struct ipw_priv *priv, |
6216 | char *capabilities, int length) | 6233 | char *capabilities, int length) |
6217 | { | 6234 | { |
6218 | struct host_cmd cmd = { | ||
6219 | .cmd = IPW_CMD_RSN_CAPABILITIES, | ||
6220 | .len = length, | ||
6221 | }; | ||
6222 | |||
6223 | IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n"); | 6235 | IPW_DEBUG_HC("HOST_CMD_RSN_CAPABILITIES\n"); |
6224 | 6236 | ||
6225 | memcpy(cmd.param, capabilities, length); | 6237 | return ipw_send_cmd_pdu(priv, IPW_CMD_RSN_CAPABILITIES, length, |
6226 | return ipw_send_cmd(priv, &cmd); | 6238 | capabilities); |
6227 | } | 6239 | } |
6228 | 6240 | ||
6229 | /* | 6241 | /* |
@@ -6244,7 +6256,7 @@ static int ipw_wx_set_genie(struct net_device *dev, | |||
6244 | (wrqu->data.length && extra == NULL)) | 6256 | (wrqu->data.length && extra == NULL)) |
6245 | return -EINVAL; | 6257 | return -EINVAL; |
6246 | 6258 | ||
6247 | //down(&priv->sem); | 6259 | //mutex_lock(&priv->mutex); |
6248 | 6260 | ||
6249 | //if (!ieee->wpa_enabled) { | 6261 | //if (!ieee->wpa_enabled) { |
6250 | // err = -EOPNOTSUPP; | 6262 | // err = -EOPNOTSUPP; |
@@ -6270,7 +6282,7 @@ static int ipw_wx_set_genie(struct net_device *dev, | |||
6270 | 6282 | ||
6271 | ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); | 6283 | ipw_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len); |
6272 | out: | 6284 | out: |
6273 | //up(&priv->sem); | 6285 | //mutex_unlock(&priv->mutex); |
6274 | return err; | 6286 | return err; |
6275 | } | 6287 | } |
6276 | 6288 | ||
@@ -6283,7 +6295,7 @@ static int ipw_wx_get_genie(struct net_device *dev, | |||
6283 | struct ieee80211_device *ieee = priv->ieee; | 6295 | struct ieee80211_device *ieee = priv->ieee; |
6284 | int err = 0; | 6296 | int err = 0; |
6285 | 6297 | ||
6286 | //down(&priv->sem); | 6298 | //mutex_lock(&priv->mutex); |
6287 | 6299 | ||
6288 | //if (!ieee->wpa_enabled) { | 6300 | //if (!ieee->wpa_enabled) { |
6289 | // err = -EOPNOTSUPP; | 6301 | // err = -EOPNOTSUPP; |
@@ -6304,7 +6316,7 @@ static int ipw_wx_get_genie(struct net_device *dev, | |||
6304 | memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); | 6316 | memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); |
6305 | 6317 | ||
6306 | out: | 6318 | out: |
6307 | //up(&priv->sem); | 6319 | //mutex_unlock(&priv->mutex); |
6308 | return err; | 6320 | return err; |
6309 | } | 6321 | } |
6310 | 6322 | ||
@@ -6964,12 +6976,12 @@ static void ipw_bg_qos_activate(void *data) | |||
6964 | if (priv == NULL) | 6976 | if (priv == NULL) |
6965 | return; | 6977 | return; |
6966 | 6978 | ||
6967 | down(&priv->sem); | 6979 | mutex_lock(&priv->mutex); |
6968 | 6980 | ||
6969 | if (priv->status & STATUS_ASSOCIATED) | 6981 | if (priv->status & STATUS_ASSOCIATED) |
6970 | ipw_qos_activate(priv, &(priv->assoc_network->qos_data)); | 6982 | ipw_qos_activate(priv, &(priv->assoc_network->qos_data)); |
6971 | 6983 | ||
6972 | up(&priv->sem); | 6984 | mutex_unlock(&priv->mutex); |
6973 | } | 6985 | } |
6974 | 6986 | ||
6975 | static int ipw_handle_probe_response(struct net_device *dev, | 6987 | static int ipw_handle_probe_response(struct net_device *dev, |
@@ -7010,25 +7022,15 @@ static int ipw_handle_assoc_response(struct net_device *dev, | |||
7010 | static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters | 7022 | static int ipw_send_qos_params_command(struct ipw_priv *priv, struct ieee80211_qos_parameters |
7011 | *qos_param) | 7023 | *qos_param) |
7012 | { | 7024 | { |
7013 | struct host_cmd cmd = { | 7025 | return ipw_send_cmd_pdu(priv, IPW_CMD_QOS_PARAMETERS, |
7014 | .cmd = IPW_CMD_QOS_PARAMETERS, | 7026 | sizeof(*qos_param) * 3, qos_param); |
7015 | .len = (sizeof(struct ieee80211_qos_parameters) * 3) | ||
7016 | }; | ||
7017 | |||
7018 | memcpy(cmd.param, qos_param, sizeof(*qos_param) * 3); | ||
7019 | return ipw_send_cmd(priv, &cmd); | ||
7020 | } | 7027 | } |
7021 | 7028 | ||
7022 | static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element | 7029 | static int ipw_send_qos_info_command(struct ipw_priv *priv, struct ieee80211_qos_information_element |
7023 | *qos_param) | 7030 | *qos_param) |
7024 | { | 7031 | { |
7025 | struct host_cmd cmd = { | 7032 | return ipw_send_cmd_pdu(priv, IPW_CMD_WME_INFO, sizeof(*qos_param), |
7026 | .cmd = IPW_CMD_WME_INFO, | 7033 | qos_param); |
7027 | .len = sizeof(*qos_param) | ||
7028 | }; | ||
7029 | |||
7030 | memcpy(cmd.param, qos_param, sizeof(*qos_param)); | ||
7031 | return ipw_send_cmd(priv, &cmd); | ||
7032 | } | 7034 | } |
7033 | 7035 | ||
7034 | #endif /* CONFIG_IPW_QOS */ | 7036 | #endif /* CONFIG_IPW_QOS */ |
@@ -7052,19 +7054,22 @@ static int ipw_associate_network(struct ipw_priv *priv, | |||
7052 | 7054 | ||
7053 | memset(&priv->assoc_request, 0, sizeof(priv->assoc_request)); | 7055 | memset(&priv->assoc_request, 0, sizeof(priv->assoc_request)); |
7054 | priv->assoc_request.channel = network->channel; | 7056 | priv->assoc_request.channel = network->channel; |
7057 | priv->assoc_request.auth_key = 0; | ||
7058 | |||
7055 | if ((priv->capability & CAP_PRIVACY_ON) && | 7059 | if ((priv->capability & CAP_PRIVACY_ON) && |
7056 | (priv->capability & CAP_SHARED_KEY)) { | 7060 | (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)) { |
7057 | priv->assoc_request.auth_type = AUTH_SHARED_KEY; | 7061 | priv->assoc_request.auth_type = AUTH_SHARED_KEY; |
7058 | priv->assoc_request.auth_key = priv->ieee->sec.active_key; | 7062 | priv->assoc_request.auth_key = priv->ieee->sec.active_key; |
7059 | 7063 | ||
7060 | if ((priv->capability & CAP_PRIVACY_ON) && | 7064 | if ((priv->ieee->sec.level == SEC_LEVEL_1) && |
7061 | (priv->ieee->sec.level == SEC_LEVEL_1) && | ||
7062 | !(priv->ieee->host_encrypt || priv->ieee->host_decrypt)) | 7065 | !(priv->ieee->host_encrypt || priv->ieee->host_decrypt)) |
7063 | ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP); | 7066 | ipw_send_wep_keys(priv, DCW_WEP_KEY_SEC_TYPE_WEP); |
7064 | } else { | 7067 | |
7068 | } else if ((priv->capability & CAP_PRIVACY_ON) && | ||
7069 | (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)) | ||
7070 | priv->assoc_request.auth_type = AUTH_LEAP; | ||
7071 | else | ||
7065 | priv->assoc_request.auth_type = AUTH_OPEN; | 7072 | priv->assoc_request.auth_type = AUTH_OPEN; |
7066 | priv->assoc_request.auth_key = 0; | ||
7067 | } | ||
7068 | 7073 | ||
7069 | if (priv->ieee->wpa_ie_len) { | 7074 | if (priv->ieee->wpa_ie_len) { |
7070 | priv->assoc_request.policy_support = 0x02; /* RSN active */ | 7075 | priv->assoc_request.policy_support = 0x02; /* RSN active */ |
@@ -7278,9 +7283,9 @@ static void ipw_roam(void *data) | |||
7278 | static void ipw_bg_roam(void *data) | 7283 | static void ipw_bg_roam(void *data) |
7279 | { | 7284 | { |
7280 | struct ipw_priv *priv = data; | 7285 | struct ipw_priv *priv = data; |
7281 | down(&priv->sem); | 7286 | mutex_lock(&priv->mutex); |
7282 | ipw_roam(data); | 7287 | ipw_roam(data); |
7283 | up(&priv->sem); | 7288 | mutex_unlock(&priv->mutex); |
7284 | } | 7289 | } |
7285 | 7290 | ||
7286 | static int ipw_associate(void *data) | 7291 | static int ipw_associate(void *data) |
@@ -7375,9 +7380,9 @@ static int ipw_associate(void *data) | |||
7375 | static void ipw_bg_associate(void *data) | 7380 | static void ipw_bg_associate(void *data) |
7376 | { | 7381 | { |
7377 | struct ipw_priv *priv = data; | 7382 | struct ipw_priv *priv = data; |
7378 | down(&priv->sem); | 7383 | mutex_lock(&priv->mutex); |
7379 | ipw_associate(data); | 7384 | ipw_associate(data); |
7380 | up(&priv->sem); | 7385 | mutex_unlock(&priv->mutex); |
7381 | } | 7386 | } |
7382 | 7387 | ||
7383 | static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv, | 7388 | static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv, |
@@ -8126,7 +8131,7 @@ static int ipw_wx_get_name(struct net_device *dev, | |||
8126 | union iwreq_data *wrqu, char *extra) | 8131 | union iwreq_data *wrqu, char *extra) |
8127 | { | 8132 | { |
8128 | struct ipw_priv *priv = ieee80211_priv(dev); | 8133 | struct ipw_priv *priv = ieee80211_priv(dev); |
8129 | down(&priv->sem); | 8134 | mutex_lock(&priv->mutex); |
8130 | if (priv->status & STATUS_RF_KILL_MASK) | 8135 | if (priv->status & STATUS_RF_KILL_MASK) |
8131 | strcpy(wrqu->name, "radio off"); | 8136 | strcpy(wrqu->name, "radio off"); |
8132 | else if (!(priv->status & STATUS_ASSOCIATED)) | 8137 | else if (!(priv->status & STATUS_ASSOCIATED)) |
@@ -8135,7 +8140,7 @@ static int ipw_wx_get_name(struct net_device *dev, | |||
8135 | snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", | 8140 | snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", |
8136 | ipw_modes[priv->assoc_request.ieee_mode]); | 8141 | ipw_modes[priv->assoc_request.ieee_mode]); |
8137 | IPW_DEBUG_WX("Name: %s\n", wrqu->name); | 8142 | IPW_DEBUG_WX("Name: %s\n", wrqu->name); |
8138 | up(&priv->sem); | 8143 | mutex_unlock(&priv->mutex); |
8139 | return 0; | 8144 | return 0; |
8140 | } | 8145 | } |
8141 | 8146 | ||
@@ -8204,9 +8209,9 @@ static int ipw_wx_set_freq(struct net_device *dev, | |||
8204 | 8209 | ||
8205 | if (fwrq->m == 0) { | 8210 | if (fwrq->m == 0) { |
8206 | IPW_DEBUG_WX("SET Freq/Channel -> any\n"); | 8211 | IPW_DEBUG_WX("SET Freq/Channel -> any\n"); |
8207 | down(&priv->sem); | 8212 | mutex_lock(&priv->mutex); |
8208 | ret = ipw_set_channel(priv, 0); | 8213 | ret = ipw_set_channel(priv, 0); |
8209 | up(&priv->sem); | 8214 | mutex_unlock(&priv->mutex); |
8210 | return ret; | 8215 | return ret; |
8211 | } | 8216 | } |
8212 | /* if setting by freq convert to channel */ | 8217 | /* if setting by freq convert to channel */ |
@@ -8234,9 +8239,9 @@ static int ipw_wx_set_freq(struct net_device *dev, | |||
8234 | } | 8239 | } |
8235 | 8240 | ||
8236 | IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m); | 8241 | IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m); |
8237 | down(&priv->sem); | 8242 | mutex_lock(&priv->mutex); |
8238 | ret = ipw_set_channel(priv, channel); | 8243 | ret = ipw_set_channel(priv, channel); |
8239 | up(&priv->sem); | 8244 | mutex_unlock(&priv->mutex); |
8240 | return ret; | 8245 | return ret; |
8241 | } | 8246 | } |
8242 | 8247 | ||
@@ -8250,14 +8255,14 @@ static int ipw_wx_get_freq(struct net_device *dev, | |||
8250 | 8255 | ||
8251 | /* If we are associated, trying to associate, or have a statically | 8256 | /* If we are associated, trying to associate, or have a statically |
8252 | * configured CHANNEL then return that; otherwise return ANY */ | 8257 | * configured CHANNEL then return that; otherwise return ANY */ |
8253 | down(&priv->sem); | 8258 | mutex_lock(&priv->mutex); |
8254 | if (priv->config & CFG_STATIC_CHANNEL || | 8259 | if (priv->config & CFG_STATIC_CHANNEL || |
8255 | priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) | 8260 | priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) |
8256 | wrqu->freq.m = priv->channel; | 8261 | wrqu->freq.m = priv->channel; |
8257 | else | 8262 | else |
8258 | wrqu->freq.m = 0; | 8263 | wrqu->freq.m = 0; |
8259 | 8264 | ||
8260 | up(&priv->sem); | 8265 | mutex_unlock(&priv->mutex); |
8261 | IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel); | 8266 | IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel); |
8262 | return 0; | 8267 | return 0; |
8263 | } | 8268 | } |
@@ -8287,7 +8292,7 @@ static int ipw_wx_set_mode(struct net_device *dev, | |||
8287 | if (wrqu->mode == priv->ieee->iw_mode) | 8292 | if (wrqu->mode == priv->ieee->iw_mode) |
8288 | return 0; | 8293 | return 0; |
8289 | 8294 | ||
8290 | down(&priv->sem); | 8295 | mutex_lock(&priv->mutex); |
8291 | 8296 | ||
8292 | ipw_sw_reset(priv, 0); | 8297 | ipw_sw_reset(priv, 0); |
8293 | 8298 | ||
@@ -8310,7 +8315,7 @@ static int ipw_wx_set_mode(struct net_device *dev, | |||
8310 | priv->ieee->iw_mode = wrqu->mode; | 8315 | priv->ieee->iw_mode = wrqu->mode; |
8311 | 8316 | ||
8312 | queue_work(priv->workqueue, &priv->adapter_restart); | 8317 | queue_work(priv->workqueue, &priv->adapter_restart); |
8313 | up(&priv->sem); | 8318 | mutex_unlock(&priv->mutex); |
8314 | return err; | 8319 | return err; |
8315 | } | 8320 | } |
8316 | 8321 | ||
@@ -8319,10 +8324,10 @@ static int ipw_wx_get_mode(struct net_device *dev, | |||
8319 | union iwreq_data *wrqu, char *extra) | 8324 | union iwreq_data *wrqu, char *extra) |
8320 | { | 8325 | { |
8321 | struct ipw_priv *priv = ieee80211_priv(dev); | 8326 | struct ipw_priv *priv = ieee80211_priv(dev); |
8322 | down(&priv->sem); | 8327 | mutex_lock(&priv->mutex); |
8323 | wrqu->mode = priv->ieee->iw_mode; | 8328 | wrqu->mode = priv->ieee->iw_mode; |
8324 | IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode); | 8329 | IPW_DEBUG_WX("Get MODE -> %d\n", wrqu->mode); |
8325 | up(&priv->sem); | 8330 | mutex_unlock(&priv->mutex); |
8326 | return 0; | 8331 | return 0; |
8327 | } | 8332 | } |
8328 | 8333 | ||
@@ -8369,7 +8374,7 @@ static int ipw_wx_get_range(struct net_device *dev, | |||
8369 | range->avg_qual.level = 0; /* FIXME to real average level */ | 8374 | range->avg_qual.level = 0; /* FIXME to real average level */ |
8370 | range->avg_qual.noise = 0; | 8375 | range->avg_qual.noise = 0; |
8371 | range->avg_qual.updated = 7; /* Updated all three */ | 8376 | range->avg_qual.updated = 7; /* Updated all three */ |
8372 | down(&priv->sem); | 8377 | mutex_lock(&priv->mutex); |
8373 | range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES); | 8378 | range->num_bitrates = min(priv->rates.num_rates, (u8) IW_MAX_BITRATES); |
8374 | 8379 | ||
8375 | for (i = 0; i < range->num_bitrates; i++) | 8380 | for (i = 0; i < range->num_bitrates; i++) |
@@ -8387,7 +8392,7 @@ static int ipw_wx_get_range(struct net_device *dev, | |||
8387 | 8392 | ||
8388 | /* Set the Wireless Extension versions */ | 8393 | /* Set the Wireless Extension versions */ |
8389 | range->we_version_compiled = WIRELESS_EXT; | 8394 | range->we_version_compiled = WIRELESS_EXT; |
8390 | range->we_version_source = 16; | 8395 | range->we_version_source = 18; |
8391 | 8396 | ||
8392 | i = 0; | 8397 | i = 0; |
8393 | if (priv->ieee->mode & (IEEE_B | IEEE_G)) { | 8398 | if (priv->ieee->mode & (IEEE_B | IEEE_G)) { |
@@ -8411,7 +8416,7 @@ static int ipw_wx_get_range(struct net_device *dev, | |||
8411 | range->num_channels = i; | 8416 | range->num_channels = i; |
8412 | range->num_frequency = i; | 8417 | range->num_frequency = i; |
8413 | 8418 | ||
8414 | up(&priv->sem); | 8419 | mutex_unlock(&priv->mutex); |
8415 | 8420 | ||
8416 | /* Event capability (kernel + driver) */ | 8421 | /* Event capability (kernel + driver) */ |
8417 | range->event_capa[0] = (IW_EVENT_CAPA_K_0 | | 8422 | range->event_capa[0] = (IW_EVENT_CAPA_K_0 | |
@@ -8419,6 +8424,9 @@ static int ipw_wx_get_range(struct net_device *dev, | |||
8419 | IW_EVENT_CAPA_MASK(SIOCGIWAP)); | 8424 | IW_EVENT_CAPA_MASK(SIOCGIWAP)); |
8420 | range->event_capa[1] = IW_EVENT_CAPA_K_1; | 8425 | range->event_capa[1] = IW_EVENT_CAPA_K_1; |
8421 | 8426 | ||
8427 | range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | | ||
8428 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; | ||
8429 | |||
8422 | IPW_DEBUG_WX("GET Range\n"); | 8430 | IPW_DEBUG_WX("GET Range\n"); |
8423 | return 0; | 8431 | return 0; |
8424 | } | 8432 | } |
@@ -8438,7 +8446,7 @@ static int ipw_wx_set_wap(struct net_device *dev, | |||
8438 | 8446 | ||
8439 | if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) | 8447 | if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) |
8440 | return -EINVAL; | 8448 | return -EINVAL; |
8441 | down(&priv->sem); | 8449 | mutex_lock(&priv->mutex); |
8442 | if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) || | 8450 | if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) || |
8443 | !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) { | 8451 | !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) { |
8444 | /* we disable mandatory BSSID association */ | 8452 | /* we disable mandatory BSSID association */ |
@@ -8447,14 +8455,14 @@ static int ipw_wx_set_wap(struct net_device *dev, | |||
8447 | IPW_DEBUG_ASSOC("Attempting to associate with new " | 8455 | IPW_DEBUG_ASSOC("Attempting to associate with new " |
8448 | "parameters.\n"); | 8456 | "parameters.\n"); |
8449 | ipw_associate(priv); | 8457 | ipw_associate(priv); |
8450 | up(&priv->sem); | 8458 | mutex_unlock(&priv->mutex); |
8451 | return 0; | 8459 | return 0; |
8452 | } | 8460 | } |
8453 | 8461 | ||
8454 | priv->config |= CFG_STATIC_BSSID; | 8462 | priv->config |= CFG_STATIC_BSSID; |
8455 | if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) { | 8463 | if (!memcmp(priv->bssid, wrqu->ap_addr.sa_data, ETH_ALEN)) { |
8456 | IPW_DEBUG_WX("BSSID set to current BSSID.\n"); | 8464 | IPW_DEBUG_WX("BSSID set to current BSSID.\n"); |
8457 | up(&priv->sem); | 8465 | mutex_unlock(&priv->mutex); |
8458 | return 0; | 8466 | return 0; |
8459 | } | 8467 | } |
8460 | 8468 | ||
@@ -8468,7 +8476,7 @@ static int ipw_wx_set_wap(struct net_device *dev, | |||
8468 | if (!ipw_disassociate(priv)) | 8476 | if (!ipw_disassociate(priv)) |
8469 | ipw_associate(priv); | 8477 | ipw_associate(priv); |
8470 | 8478 | ||
8471 | up(&priv->sem); | 8479 | mutex_unlock(&priv->mutex); |
8472 | return 0; | 8480 | return 0; |
8473 | } | 8481 | } |
8474 | 8482 | ||
@@ -8479,7 +8487,7 @@ static int ipw_wx_get_wap(struct net_device *dev, | |||
8479 | struct ipw_priv *priv = ieee80211_priv(dev); | 8487 | struct ipw_priv *priv = ieee80211_priv(dev); |
8480 | /* If we are associated, trying to associate, or have a statically | 8488 | /* If we are associated, trying to associate, or have a statically |
8481 | * configured BSSID then return that; otherwise return ANY */ | 8489 | * configured BSSID then return that; otherwise return ANY */ |
8482 | down(&priv->sem); | 8490 | mutex_lock(&priv->mutex); |
8483 | if (priv->config & CFG_STATIC_BSSID || | 8491 | if (priv->config & CFG_STATIC_BSSID || |
8484 | priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { | 8492 | priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { |
8485 | wrqu->ap_addr.sa_family = ARPHRD_ETHER; | 8493 | wrqu->ap_addr.sa_family = ARPHRD_ETHER; |
@@ -8489,7 +8497,7 @@ static int ipw_wx_get_wap(struct net_device *dev, | |||
8489 | 8497 | ||
8490 | IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n", | 8498 | IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n", |
8491 | MAC_ARG(wrqu->ap_addr.sa_data)); | 8499 | MAC_ARG(wrqu->ap_addr.sa_data)); |
8492 | up(&priv->sem); | 8500 | mutex_unlock(&priv->mutex); |
8493 | return 0; | 8501 | return 0; |
8494 | } | 8502 | } |
8495 | 8503 | ||
@@ -8500,7 +8508,7 @@ static int ipw_wx_set_essid(struct net_device *dev, | |||
8500 | struct ipw_priv *priv = ieee80211_priv(dev); | 8508 | struct ipw_priv *priv = ieee80211_priv(dev); |
8501 | char *essid = ""; /* ANY */ | 8509 | char *essid = ""; /* ANY */ |
8502 | int length = 0; | 8510 | int length = 0; |
8503 | down(&priv->sem); | 8511 | mutex_lock(&priv->mutex); |
8504 | if (wrqu->essid.flags && wrqu->essid.length) { | 8512 | if (wrqu->essid.flags && wrqu->essid.length) { |
8505 | length = wrqu->essid.length - 1; | 8513 | length = wrqu->essid.length - 1; |
8506 | essid = extra; | 8514 | essid = extra; |
@@ -8515,7 +8523,7 @@ static int ipw_wx_set_essid(struct net_device *dev, | |||
8515 | priv->config &= ~CFG_STATIC_ESSID; | 8523 | priv->config &= ~CFG_STATIC_ESSID; |
8516 | ipw_associate(priv); | 8524 | ipw_associate(priv); |
8517 | } | 8525 | } |
8518 | up(&priv->sem); | 8526 | mutex_unlock(&priv->mutex); |
8519 | return 0; | 8527 | return 0; |
8520 | } | 8528 | } |
8521 | 8529 | ||
@@ -8525,7 +8533,7 @@ static int ipw_wx_set_essid(struct net_device *dev, | |||
8525 | 8533 | ||
8526 | if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { | 8534 | if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) { |
8527 | IPW_DEBUG_WX("ESSID set to current ESSID.\n"); | 8535 | IPW_DEBUG_WX("ESSID set to current ESSID.\n"); |
8528 | up(&priv->sem); | 8536 | mutex_unlock(&priv->mutex); |
8529 | return 0; | 8537 | return 0; |
8530 | } | 8538 | } |
8531 | 8539 | ||
@@ -8540,7 +8548,7 @@ static int ipw_wx_set_essid(struct net_device *dev, | |||
8540 | if (!ipw_disassociate(priv)) | 8548 | if (!ipw_disassociate(priv)) |
8541 | ipw_associate(priv); | 8549 | ipw_associate(priv); |
8542 | 8550 | ||
8543 | up(&priv->sem); | 8551 | mutex_unlock(&priv->mutex); |
8544 | return 0; | 8552 | return 0; |
8545 | } | 8553 | } |
8546 | 8554 | ||
@@ -8552,7 +8560,7 @@ static int ipw_wx_get_essid(struct net_device *dev, | |||
8552 | 8560 | ||
8553 | /* If we are associated, trying to associate, or have a statically | 8561 | /* If we are associated, trying to associate, or have a statically |
8554 | * configured ESSID then return that; otherwise return ANY */ | 8562 | * configured ESSID then return that; otherwise return ANY */ |
8555 | down(&priv->sem); | 8563 | mutex_lock(&priv->mutex); |
8556 | if (priv->config & CFG_STATIC_ESSID || | 8564 | if (priv->config & CFG_STATIC_ESSID || |
8557 | priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { | 8565 | priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) { |
8558 | IPW_DEBUG_WX("Getting essid: '%s'\n", | 8566 | IPW_DEBUG_WX("Getting essid: '%s'\n", |
@@ -8565,7 +8573,7 @@ static int ipw_wx_get_essid(struct net_device *dev, | |||
8565 | wrqu->essid.length = 0; | 8573 | wrqu->essid.length = 0; |
8566 | wrqu->essid.flags = 0; /* active */ | 8574 | wrqu->essid.flags = 0; /* active */ |
8567 | } | 8575 | } |
8568 | up(&priv->sem); | 8576 | mutex_unlock(&priv->mutex); |
8569 | return 0; | 8577 | return 0; |
8570 | } | 8578 | } |
8571 | 8579 | ||
@@ -8578,12 +8586,12 @@ static int ipw_wx_set_nick(struct net_device *dev, | |||
8578 | IPW_DEBUG_WX("Setting nick to '%s'\n", extra); | 8586 | IPW_DEBUG_WX("Setting nick to '%s'\n", extra); |
8579 | if (wrqu->data.length > IW_ESSID_MAX_SIZE) | 8587 | if (wrqu->data.length > IW_ESSID_MAX_SIZE) |
8580 | return -E2BIG; | 8588 | return -E2BIG; |
8581 | down(&priv->sem); | 8589 | mutex_lock(&priv->mutex); |
8582 | wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick)); | 8590 | wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick)); |
8583 | memset(priv->nick, 0, sizeof(priv->nick)); | 8591 | memset(priv->nick, 0, sizeof(priv->nick)); |
8584 | memcpy(priv->nick, extra, wrqu->data.length); | 8592 | memcpy(priv->nick, extra, wrqu->data.length); |
8585 | IPW_DEBUG_TRACE("<<\n"); | 8593 | IPW_DEBUG_TRACE("<<\n"); |
8586 | up(&priv->sem); | 8594 | mutex_unlock(&priv->mutex); |
8587 | return 0; | 8595 | return 0; |
8588 | 8596 | ||
8589 | } | 8597 | } |
@@ -8594,11 +8602,11 @@ static int ipw_wx_get_nick(struct net_device *dev, | |||
8594 | { | 8602 | { |
8595 | struct ipw_priv *priv = ieee80211_priv(dev); | 8603 | struct ipw_priv *priv = ieee80211_priv(dev); |
8596 | IPW_DEBUG_WX("Getting nick\n"); | 8604 | IPW_DEBUG_WX("Getting nick\n"); |
8597 | down(&priv->sem); | 8605 | mutex_lock(&priv->mutex); |
8598 | wrqu->data.length = strlen(priv->nick) + 1; | 8606 | wrqu->data.length = strlen(priv->nick) + 1; |
8599 | memcpy(extra, priv->nick, wrqu->data.length); | 8607 | memcpy(extra, priv->nick, wrqu->data.length); |
8600 | wrqu->data.flags = 1; /* active */ | 8608 | wrqu->data.flags = 1; /* active */ |
8601 | up(&priv->sem); | 8609 | mutex_unlock(&priv->mutex); |
8602 | return 0; | 8610 | return 0; |
8603 | } | 8611 | } |
8604 | 8612 | ||
@@ -8691,7 +8699,7 @@ static int ipw_wx_set_rate(struct net_device *dev, | |||
8691 | apply: | 8699 | apply: |
8692 | IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n", | 8700 | IPW_DEBUG_WX("Setting rate mask to 0x%08X [%s]\n", |
8693 | mask, fixed ? "fixed" : "sub-rates"); | 8701 | mask, fixed ? "fixed" : "sub-rates"); |
8694 | down(&priv->sem); | 8702 | mutex_lock(&priv->mutex); |
8695 | if (mask == IEEE80211_DEFAULT_RATES_MASK) { | 8703 | if (mask == IEEE80211_DEFAULT_RATES_MASK) { |
8696 | priv->config &= ~CFG_FIXED_RATE; | 8704 | priv->config &= ~CFG_FIXED_RATE; |
8697 | ipw_set_fixed_rate(priv, priv->ieee->mode); | 8705 | ipw_set_fixed_rate(priv, priv->ieee->mode); |
@@ -8700,7 +8708,7 @@ static int ipw_wx_set_rate(struct net_device *dev, | |||
8700 | 8708 | ||
8701 | if (priv->rates_mask == mask) { | 8709 | if (priv->rates_mask == mask) { |
8702 | IPW_DEBUG_WX("Mask set to current mask.\n"); | 8710 | IPW_DEBUG_WX("Mask set to current mask.\n"); |
8703 | up(&priv->sem); | 8711 | mutex_unlock(&priv->mutex); |
8704 | return 0; | 8712 | return 0; |
8705 | } | 8713 | } |
8706 | 8714 | ||
@@ -8711,7 +8719,7 @@ static int ipw_wx_set_rate(struct net_device *dev, | |||
8711 | if (!ipw_disassociate(priv)) | 8719 | if (!ipw_disassociate(priv)) |
8712 | ipw_associate(priv); | 8720 | ipw_associate(priv); |
8713 | 8721 | ||
8714 | up(&priv->sem); | 8722 | mutex_unlock(&priv->mutex); |
8715 | return 0; | 8723 | return 0; |
8716 | } | 8724 | } |
8717 | 8725 | ||
@@ -8720,9 +8728,9 @@ static int ipw_wx_get_rate(struct net_device *dev, | |||
8720 | union iwreq_data *wrqu, char *extra) | 8728 | union iwreq_data *wrqu, char *extra) |
8721 | { | 8729 | { |
8722 | struct ipw_priv *priv = ieee80211_priv(dev); | 8730 | struct ipw_priv *priv = ieee80211_priv(dev); |
8723 | down(&priv->sem); | 8731 | mutex_lock(&priv->mutex); |
8724 | wrqu->bitrate.value = priv->last_rate; | 8732 | wrqu->bitrate.value = priv->last_rate; |
8725 | up(&priv->sem); | 8733 | mutex_unlock(&priv->mutex); |
8726 | IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); | 8734 | IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value); |
8727 | return 0; | 8735 | return 0; |
8728 | } | 8736 | } |
@@ -8732,20 +8740,20 @@ static int ipw_wx_set_rts(struct net_device *dev, | |||
8732 | union iwreq_data *wrqu, char *extra) | 8740 | union iwreq_data *wrqu, char *extra) |
8733 | { | 8741 | { |
8734 | struct ipw_priv *priv = ieee80211_priv(dev); | 8742 | struct ipw_priv *priv = ieee80211_priv(dev); |
8735 | down(&priv->sem); | 8743 | mutex_lock(&priv->mutex); |
8736 | if (wrqu->rts.disabled) | 8744 | if (wrqu->rts.disabled) |
8737 | priv->rts_threshold = DEFAULT_RTS_THRESHOLD; | 8745 | priv->rts_threshold = DEFAULT_RTS_THRESHOLD; |
8738 | else { | 8746 | else { |
8739 | if (wrqu->rts.value < MIN_RTS_THRESHOLD || | 8747 | if (wrqu->rts.value < MIN_RTS_THRESHOLD || |
8740 | wrqu->rts.value > MAX_RTS_THRESHOLD) { | 8748 | wrqu->rts.value > MAX_RTS_THRESHOLD) { |
8741 | up(&priv->sem); | 8749 | mutex_unlock(&priv->mutex); |
8742 | return -EINVAL; | 8750 | return -EINVAL; |
8743 | } | 8751 | } |
8744 | priv->rts_threshold = wrqu->rts.value; | 8752 | priv->rts_threshold = wrqu->rts.value; |
8745 | } | 8753 | } |
8746 | 8754 | ||
8747 | ipw_send_rts_threshold(priv, priv->rts_threshold); | 8755 | ipw_send_rts_threshold(priv, priv->rts_threshold); |
8748 | up(&priv->sem); | 8756 | mutex_unlock(&priv->mutex); |
8749 | IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold); | 8757 | IPW_DEBUG_WX("SET RTS Threshold -> %d \n", priv->rts_threshold); |
8750 | return 0; | 8758 | return 0; |
8751 | } | 8759 | } |
@@ -8755,11 +8763,11 @@ static int ipw_wx_get_rts(struct net_device *dev, | |||
8755 | union iwreq_data *wrqu, char *extra) | 8763 | union iwreq_data *wrqu, char *extra) |
8756 | { | 8764 | { |
8757 | struct ipw_priv *priv = ieee80211_priv(dev); | 8765 | struct ipw_priv *priv = ieee80211_priv(dev); |
8758 | down(&priv->sem); | 8766 | mutex_lock(&priv->mutex); |
8759 | wrqu->rts.value = priv->rts_threshold; | 8767 | wrqu->rts.value = priv->rts_threshold; |
8760 | wrqu->rts.fixed = 0; /* no auto select */ | 8768 | wrqu->rts.fixed = 0; /* no auto select */ |
8761 | wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); | 8769 | wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD); |
8762 | up(&priv->sem); | 8770 | mutex_unlock(&priv->mutex); |
8763 | IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value); | 8771 | IPW_DEBUG_WX("GET RTS Threshold -> %d \n", wrqu->rts.value); |
8764 | return 0; | 8772 | return 0; |
8765 | } | 8773 | } |
@@ -8771,7 +8779,7 @@ static int ipw_wx_set_txpow(struct net_device *dev, | |||
8771 | struct ipw_priv *priv = ieee80211_priv(dev); | 8779 | struct ipw_priv *priv = ieee80211_priv(dev); |
8772 | int err = 0; | 8780 | int err = 0; |
8773 | 8781 | ||
8774 | down(&priv->sem); | 8782 | mutex_lock(&priv->mutex); |
8775 | if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) { | 8783 | if (ipw_radio_kill_sw(priv, wrqu->power.disabled)) { |
8776 | err = -EINPROGRESS; | 8784 | err = -EINPROGRESS; |
8777 | goto out; | 8785 | goto out; |
@@ -8794,7 +8802,7 @@ static int ipw_wx_set_txpow(struct net_device *dev, | |||
8794 | priv->tx_power = wrqu->power.value; | 8802 | priv->tx_power = wrqu->power.value; |
8795 | err = ipw_set_tx_power(priv); | 8803 | err = ipw_set_tx_power(priv); |
8796 | out: | 8804 | out: |
8797 | up(&priv->sem); | 8805 | mutex_unlock(&priv->mutex); |
8798 | return err; | 8806 | return err; |
8799 | } | 8807 | } |
8800 | 8808 | ||
@@ -8803,12 +8811,12 @@ static int ipw_wx_get_txpow(struct net_device *dev, | |||
8803 | union iwreq_data *wrqu, char *extra) | 8811 | union iwreq_data *wrqu, char *extra) |
8804 | { | 8812 | { |
8805 | struct ipw_priv *priv = ieee80211_priv(dev); | 8813 | struct ipw_priv *priv = ieee80211_priv(dev); |
8806 | down(&priv->sem); | 8814 | mutex_lock(&priv->mutex); |
8807 | wrqu->power.value = priv->tx_power; | 8815 | wrqu->power.value = priv->tx_power; |
8808 | wrqu->power.fixed = 1; | 8816 | wrqu->power.fixed = 1; |
8809 | wrqu->power.flags = IW_TXPOW_DBM; | 8817 | wrqu->power.flags = IW_TXPOW_DBM; |
8810 | wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; | 8818 | wrqu->power.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0; |
8811 | up(&priv->sem); | 8819 | mutex_unlock(&priv->mutex); |
8812 | 8820 | ||
8813 | IPW_DEBUG_WX("GET TX Power -> %s %d \n", | 8821 | IPW_DEBUG_WX("GET TX Power -> %s %d \n", |
8814 | wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value); | 8822 | wrqu->power.disabled ? "OFF" : "ON", wrqu->power.value); |
@@ -8821,13 +8829,13 @@ static int ipw_wx_set_frag(struct net_device *dev, | |||
8821 | union iwreq_data *wrqu, char *extra) | 8829 | union iwreq_data *wrqu, char *extra) |
8822 | { | 8830 | { |
8823 | struct ipw_priv *priv = ieee80211_priv(dev); | 8831 | struct ipw_priv *priv = ieee80211_priv(dev); |
8824 | down(&priv->sem); | 8832 | mutex_lock(&priv->mutex); |
8825 | if (wrqu->frag.disabled) | 8833 | if (wrqu->frag.disabled) |
8826 | priv->ieee->fts = DEFAULT_FTS; | 8834 | priv->ieee->fts = DEFAULT_FTS; |
8827 | else { | 8835 | else { |
8828 | if (wrqu->frag.value < MIN_FRAG_THRESHOLD || | 8836 | if (wrqu->frag.value < MIN_FRAG_THRESHOLD || |
8829 | wrqu->frag.value > MAX_FRAG_THRESHOLD) { | 8837 | wrqu->frag.value > MAX_FRAG_THRESHOLD) { |
8830 | up(&priv->sem); | 8838 | mutex_unlock(&priv->mutex); |
8831 | return -EINVAL; | 8839 | return -EINVAL; |
8832 | } | 8840 | } |
8833 | 8841 | ||
@@ -8835,7 +8843,7 @@ static int ipw_wx_set_frag(struct net_device *dev, | |||
8835 | } | 8843 | } |
8836 | 8844 | ||
8837 | ipw_send_frag_threshold(priv, wrqu->frag.value); | 8845 | ipw_send_frag_threshold(priv, wrqu->frag.value); |
8838 | up(&priv->sem); | 8846 | mutex_unlock(&priv->mutex); |
8839 | IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value); | 8847 | IPW_DEBUG_WX("SET Frag Threshold -> %d \n", wrqu->frag.value); |
8840 | return 0; | 8848 | return 0; |
8841 | } | 8849 | } |
@@ -8845,11 +8853,11 @@ static int ipw_wx_get_frag(struct net_device *dev, | |||
8845 | union iwreq_data *wrqu, char *extra) | 8853 | union iwreq_data *wrqu, char *extra) |
8846 | { | 8854 | { |
8847 | struct ipw_priv *priv = ieee80211_priv(dev); | 8855 | struct ipw_priv *priv = ieee80211_priv(dev); |
8848 | down(&priv->sem); | 8856 | mutex_lock(&priv->mutex); |
8849 | wrqu->frag.value = priv->ieee->fts; | 8857 | wrqu->frag.value = priv->ieee->fts; |
8850 | wrqu->frag.fixed = 0; /* no auto select */ | 8858 | wrqu->frag.fixed = 0; /* no auto select */ |
8851 | wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS); | 8859 | wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FTS); |
8852 | up(&priv->sem); | 8860 | mutex_unlock(&priv->mutex); |
8853 | IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value); | 8861 | IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value); |
8854 | 8862 | ||
8855 | return 0; | 8863 | return 0; |
@@ -8870,7 +8878,7 @@ static int ipw_wx_set_retry(struct net_device *dev, | |||
8870 | if (wrqu->retry.value < 0 || wrqu->retry.value > 255) | 8878 | if (wrqu->retry.value < 0 || wrqu->retry.value > 255) |
8871 | return -EINVAL; | 8879 | return -EINVAL; |
8872 | 8880 | ||
8873 | down(&priv->sem); | 8881 | mutex_lock(&priv->mutex); |
8874 | if (wrqu->retry.flags & IW_RETRY_MIN) | 8882 | if (wrqu->retry.flags & IW_RETRY_MIN) |
8875 | priv->short_retry_limit = (u8) wrqu->retry.value; | 8883 | priv->short_retry_limit = (u8) wrqu->retry.value; |
8876 | else if (wrqu->retry.flags & IW_RETRY_MAX) | 8884 | else if (wrqu->retry.flags & IW_RETRY_MAX) |
@@ -8882,7 +8890,7 @@ static int ipw_wx_set_retry(struct net_device *dev, | |||
8882 | 8890 | ||
8883 | ipw_send_retry_limit(priv, priv->short_retry_limit, | 8891 | ipw_send_retry_limit(priv, priv->short_retry_limit, |
8884 | priv->long_retry_limit); | 8892 | priv->long_retry_limit); |
8885 | up(&priv->sem); | 8893 | mutex_unlock(&priv->mutex); |
8886 | IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n", | 8894 | IPW_DEBUG_WX("SET retry limit -> short:%d long:%d\n", |
8887 | priv->short_retry_limit, priv->long_retry_limit); | 8895 | priv->short_retry_limit, priv->long_retry_limit); |
8888 | return 0; | 8896 | return 0; |
@@ -8894,11 +8902,11 @@ static int ipw_wx_get_retry(struct net_device *dev, | |||
8894 | { | 8902 | { |
8895 | struct ipw_priv *priv = ieee80211_priv(dev); | 8903 | struct ipw_priv *priv = ieee80211_priv(dev); |
8896 | 8904 | ||
8897 | down(&priv->sem); | 8905 | mutex_lock(&priv->mutex); |
8898 | wrqu->retry.disabled = 0; | 8906 | wrqu->retry.disabled = 0; |
8899 | 8907 | ||
8900 | if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { | 8908 | if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { |
8901 | up(&priv->sem); | 8909 | mutex_unlock(&priv->mutex); |
8902 | return -EINVAL; | 8910 | return -EINVAL; |
8903 | } | 8911 | } |
8904 | 8912 | ||
@@ -8912,7 +8920,7 @@ static int ipw_wx_get_retry(struct net_device *dev, | |||
8912 | wrqu->retry.flags = IW_RETRY_LIMIT; | 8920 | wrqu->retry.flags = IW_RETRY_LIMIT; |
8913 | wrqu->retry.value = priv->short_retry_limit; | 8921 | wrqu->retry.value = priv->short_retry_limit; |
8914 | } | 8922 | } |
8915 | up(&priv->sem); | 8923 | mutex_unlock(&priv->mutex); |
8916 | 8924 | ||
8917 | IPW_DEBUG_WX("GET retry -> %d \n", wrqu->retry.value); | 8925 | IPW_DEBUG_WX("GET retry -> %d \n", wrqu->retry.value); |
8918 | 8926 | ||
@@ -8929,7 +8937,7 @@ static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid, | |||
8929 | (priv->status & STATUS_EXIT_PENDING)) | 8937 | (priv->status & STATUS_EXIT_PENDING)) |
8930 | return 0; | 8938 | return 0; |
8931 | 8939 | ||
8932 | down(&priv->sem); | 8940 | mutex_lock(&priv->mutex); |
8933 | 8941 | ||
8934 | if (priv->status & STATUS_RF_KILL_MASK) { | 8942 | if (priv->status & STATUS_RF_KILL_MASK) { |
8935 | IPW_DEBUG_HC("Aborting scan due to RF kill activation\n"); | 8943 | IPW_DEBUG_HC("Aborting scan due to RF kill activation\n"); |
@@ -8981,7 +8989,7 @@ static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid, | |||
8981 | priv->status |= STATUS_SCANNING; | 8989 | priv->status |= STATUS_SCANNING; |
8982 | 8990 | ||
8983 | done: | 8991 | done: |
8984 | up(&priv->sem); | 8992 | mutex_unlock(&priv->mutex); |
8985 | return err; | 8993 | return err; |
8986 | } | 8994 | } |
8987 | 8995 | ||
@@ -9024,7 +9032,7 @@ static int ipw_wx_set_encode(struct net_device *dev, | |||
9024 | int ret; | 9032 | int ret; |
9025 | u32 cap = priv->capability; | 9033 | u32 cap = priv->capability; |
9026 | 9034 | ||
9027 | down(&priv->sem); | 9035 | mutex_lock(&priv->mutex); |
9028 | ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key); | 9036 | ret = ieee80211_wx_set_encode(priv->ieee, info, wrqu, key); |
9029 | 9037 | ||
9030 | /* In IBSS mode, we need to notify the firmware to update | 9038 | /* In IBSS mode, we need to notify the firmware to update |
@@ -9034,7 +9042,7 @@ static int ipw_wx_set_encode(struct net_device *dev, | |||
9034 | priv->status & STATUS_ASSOCIATED) | 9042 | priv->status & STATUS_ASSOCIATED) |
9035 | ipw_disassociate(priv); | 9043 | ipw_disassociate(priv); |
9036 | 9044 | ||
9037 | up(&priv->sem); | 9045 | mutex_unlock(&priv->mutex); |
9038 | return ret; | 9046 | return ret; |
9039 | } | 9047 | } |
9040 | 9048 | ||
@@ -9052,17 +9060,17 @@ static int ipw_wx_set_power(struct net_device *dev, | |||
9052 | { | 9060 | { |
9053 | struct ipw_priv *priv = ieee80211_priv(dev); | 9061 | struct ipw_priv *priv = ieee80211_priv(dev); |
9054 | int err; | 9062 | int err; |
9055 | down(&priv->sem); | 9063 | mutex_lock(&priv->mutex); |
9056 | if (wrqu->power.disabled) { | 9064 | if (wrqu->power.disabled) { |
9057 | priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); | 9065 | priv->power_mode = IPW_POWER_LEVEL(priv->power_mode); |
9058 | err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM); | 9066 | err = ipw_send_power_mode(priv, IPW_POWER_MODE_CAM); |
9059 | if (err) { | 9067 | if (err) { |
9060 | IPW_DEBUG_WX("failed setting power mode.\n"); | 9068 | IPW_DEBUG_WX("failed setting power mode.\n"); |
9061 | up(&priv->sem); | 9069 | mutex_unlock(&priv->mutex); |
9062 | return err; | 9070 | return err; |
9063 | } | 9071 | } |
9064 | IPW_DEBUG_WX("SET Power Management Mode -> off\n"); | 9072 | IPW_DEBUG_WX("SET Power Management Mode -> off\n"); |
9065 | up(&priv->sem); | 9073 | mutex_unlock(&priv->mutex); |
9066 | return 0; | 9074 | return 0; |
9067 | } | 9075 | } |
9068 | 9076 | ||
@@ -9074,7 +9082,7 @@ static int ipw_wx_set_power(struct net_device *dev, | |||
9074 | default: /* Otherwise we don't support it */ | 9082 | default: /* Otherwise we don't support it */ |
9075 | IPW_DEBUG_WX("SET PM Mode: %X not supported.\n", | 9083 | IPW_DEBUG_WX("SET PM Mode: %X not supported.\n", |
9076 | wrqu->power.flags); | 9084 | wrqu->power.flags); |
9077 | up(&priv->sem); | 9085 | mutex_unlock(&priv->mutex); |
9078 | return -EOPNOTSUPP; | 9086 | return -EOPNOTSUPP; |
9079 | } | 9087 | } |
9080 | 9088 | ||
@@ -9087,12 +9095,12 @@ static int ipw_wx_set_power(struct net_device *dev, | |||
9087 | err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); | 9095 | err = ipw_send_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode)); |
9088 | if (err) { | 9096 | if (err) { |
9089 | IPW_DEBUG_WX("failed setting power mode.\n"); | 9097 | IPW_DEBUG_WX("failed setting power mode.\n"); |
9090 | up(&priv->sem); | 9098 | mutex_unlock(&priv->mutex); |
9091 | return err; | 9099 | return err; |
9092 | } | 9100 | } |
9093 | 9101 | ||
9094 | IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); | 9102 | IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode); |
9095 | up(&priv->sem); | 9103 | mutex_unlock(&priv->mutex); |
9096 | return 0; | 9104 | return 0; |
9097 | } | 9105 | } |
9098 | 9106 | ||
@@ -9101,13 +9109,13 @@ static int ipw_wx_get_power(struct net_device *dev, | |||
9101 | union iwreq_data *wrqu, char *extra) | 9109 | union iwreq_data *wrqu, char *extra) |
9102 | { | 9110 | { |
9103 | struct ipw_priv *priv = ieee80211_priv(dev); | 9111 | struct ipw_priv *priv = ieee80211_priv(dev); |
9104 | down(&priv->sem); | 9112 | mutex_lock(&priv->mutex); |
9105 | if (!(priv->power_mode & IPW_POWER_ENABLED)) | 9113 | if (!(priv->power_mode & IPW_POWER_ENABLED)) |
9106 | wrqu->power.disabled = 1; | 9114 | wrqu->power.disabled = 1; |
9107 | else | 9115 | else |
9108 | wrqu->power.disabled = 0; | 9116 | wrqu->power.disabled = 0; |
9109 | 9117 | ||
9110 | up(&priv->sem); | 9118 | mutex_unlock(&priv->mutex); |
9111 | IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); | 9119 | IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode); |
9112 | 9120 | ||
9113 | return 0; | 9121 | return 0; |
@@ -9120,7 +9128,7 @@ static int ipw_wx_set_powermode(struct net_device *dev, | |||
9120 | struct ipw_priv *priv = ieee80211_priv(dev); | 9128 | struct ipw_priv *priv = ieee80211_priv(dev); |
9121 | int mode = *(int *)extra; | 9129 | int mode = *(int *)extra; |
9122 | int err; | 9130 | int err; |
9123 | down(&priv->sem); | 9131 | mutex_lock(&priv->mutex); |
9124 | if ((mode < 1) || (mode > IPW_POWER_LIMIT)) { | 9132 | if ((mode < 1) || (mode > IPW_POWER_LIMIT)) { |
9125 | mode = IPW_POWER_AC; | 9133 | mode = IPW_POWER_AC; |
9126 | priv->power_mode = mode; | 9134 | priv->power_mode = mode; |
@@ -9133,11 +9141,11 @@ static int ipw_wx_set_powermode(struct net_device *dev, | |||
9133 | 9141 | ||
9134 | if (err) { | 9142 | if (err) { |
9135 | IPW_DEBUG_WX("failed setting power mode.\n"); | 9143 | IPW_DEBUG_WX("failed setting power mode.\n"); |
9136 | up(&priv->sem); | 9144 | mutex_unlock(&priv->mutex); |
9137 | return err; | 9145 | return err; |
9138 | } | 9146 | } |
9139 | } | 9147 | } |
9140 | up(&priv->sem); | 9148 | mutex_unlock(&priv->mutex); |
9141 | return 0; | 9149 | return 0; |
9142 | } | 9150 | } |
9143 | 9151 | ||
@@ -9186,7 +9194,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, | |||
9186 | IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode); | 9194 | IPW_WARNING("Attempt to set invalid wireless mode: %d\n", mode); |
9187 | return -EINVAL; | 9195 | return -EINVAL; |
9188 | } | 9196 | } |
9189 | down(&priv->sem); | 9197 | mutex_lock(&priv->mutex); |
9190 | if (priv->adapter == IPW_2915ABG) { | 9198 | if (priv->adapter == IPW_2915ABG) { |
9191 | priv->ieee->abg_true = 1; | 9199 | priv->ieee->abg_true = 1; |
9192 | if (mode & IEEE_A) { | 9200 | if (mode & IEEE_A) { |
@@ -9198,7 +9206,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, | |||
9198 | if (mode & IEEE_A) { | 9206 | if (mode & IEEE_A) { |
9199 | IPW_WARNING("Attempt to set 2200BG into " | 9207 | IPW_WARNING("Attempt to set 2200BG into " |
9200 | "802.11a mode\n"); | 9208 | "802.11a mode\n"); |
9201 | up(&priv->sem); | 9209 | mutex_unlock(&priv->mutex); |
9202 | return -EINVAL; | 9210 | return -EINVAL; |
9203 | } | 9211 | } |
9204 | 9212 | ||
@@ -9235,7 +9243,7 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, | |||
9235 | IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n", | 9243 | IPW_DEBUG_WX("PRIV SET MODE: %c%c%c\n", |
9236 | mode & IEEE_A ? 'a' : '.', | 9244 | mode & IEEE_A ? 'a' : '.', |
9237 | mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.'); | 9245 | mode & IEEE_B ? 'b' : '.', mode & IEEE_G ? 'g' : '.'); |
9238 | up(&priv->sem); | 9246 | mutex_unlock(&priv->mutex); |
9239 | return 0; | 9247 | return 0; |
9240 | } | 9248 | } |
9241 | 9249 | ||
@@ -9244,7 +9252,7 @@ static int ipw_wx_get_wireless_mode(struct net_device *dev, | |||
9244 | union iwreq_data *wrqu, char *extra) | 9252 | union iwreq_data *wrqu, char *extra) |
9245 | { | 9253 | { |
9246 | struct ipw_priv *priv = ieee80211_priv(dev); | 9254 | struct ipw_priv *priv = ieee80211_priv(dev); |
9247 | down(&priv->sem); | 9255 | mutex_lock(&priv->mutex); |
9248 | switch (priv->ieee->mode) { | 9256 | switch (priv->ieee->mode) { |
9249 | case IEEE_A: | 9257 | case IEEE_A: |
9250 | strncpy(extra, "802.11a (1)", MAX_WX_STRING); | 9258 | strncpy(extra, "802.11a (1)", MAX_WX_STRING); |
@@ -9275,7 +9283,7 @@ static int ipw_wx_get_wireless_mode(struct net_device *dev, | |||
9275 | IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra); | 9283 | IPW_DEBUG_WX("PRIV GET MODE: %s\n", extra); |
9276 | 9284 | ||
9277 | wrqu->data.length = strlen(extra) + 1; | 9285 | wrqu->data.length = strlen(extra) + 1; |
9278 | up(&priv->sem); | 9286 | mutex_unlock(&priv->mutex); |
9279 | 9287 | ||
9280 | return 0; | 9288 | return 0; |
9281 | } | 9289 | } |
@@ -9286,7 +9294,7 @@ static int ipw_wx_set_preamble(struct net_device *dev, | |||
9286 | { | 9294 | { |
9287 | struct ipw_priv *priv = ieee80211_priv(dev); | 9295 | struct ipw_priv *priv = ieee80211_priv(dev); |
9288 | int mode = *(int *)extra; | 9296 | int mode = *(int *)extra; |
9289 | down(&priv->sem); | 9297 | mutex_lock(&priv->mutex); |
9290 | /* Switching from SHORT -> LONG requires a disassociation */ | 9298 | /* Switching from SHORT -> LONG requires a disassociation */ |
9291 | if (mode == 1) { | 9299 | if (mode == 1) { |
9292 | if (!(priv->config & CFG_PREAMBLE_LONG)) { | 9300 | if (!(priv->config & CFG_PREAMBLE_LONG)) { |
@@ -9305,11 +9313,11 @@ static int ipw_wx_set_preamble(struct net_device *dev, | |||
9305 | priv->config &= ~CFG_PREAMBLE_LONG; | 9313 | priv->config &= ~CFG_PREAMBLE_LONG; |
9306 | goto done; | 9314 | goto done; |
9307 | } | 9315 | } |
9308 | up(&priv->sem); | 9316 | mutex_unlock(&priv->mutex); |
9309 | return -EINVAL; | 9317 | return -EINVAL; |
9310 | 9318 | ||
9311 | done: | 9319 | done: |
9312 | up(&priv->sem); | 9320 | mutex_unlock(&priv->mutex); |
9313 | return 0; | 9321 | return 0; |
9314 | } | 9322 | } |
9315 | 9323 | ||
@@ -9318,12 +9326,12 @@ static int ipw_wx_get_preamble(struct net_device *dev, | |||
9318 | union iwreq_data *wrqu, char *extra) | 9326 | union iwreq_data *wrqu, char *extra) |
9319 | { | 9327 | { |
9320 | struct ipw_priv *priv = ieee80211_priv(dev); | 9328 | struct ipw_priv *priv = ieee80211_priv(dev); |
9321 | down(&priv->sem); | 9329 | mutex_lock(&priv->mutex); |
9322 | if (priv->config & CFG_PREAMBLE_LONG) | 9330 | if (priv->config & CFG_PREAMBLE_LONG) |
9323 | snprintf(wrqu->name, IFNAMSIZ, "long (1)"); | 9331 | snprintf(wrqu->name, IFNAMSIZ, "long (1)"); |
9324 | else | 9332 | else |
9325 | snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); | 9333 | snprintf(wrqu->name, IFNAMSIZ, "auto (0)"); |
9326 | up(&priv->sem); | 9334 | mutex_unlock(&priv->mutex); |
9327 | return 0; | 9335 | return 0; |
9328 | } | 9336 | } |
9329 | 9337 | ||
@@ -9335,7 +9343,7 @@ static int ipw_wx_set_monitor(struct net_device *dev, | |||
9335 | struct ipw_priv *priv = ieee80211_priv(dev); | 9343 | struct ipw_priv *priv = ieee80211_priv(dev); |
9336 | int *parms = (int *)extra; | 9344 | int *parms = (int *)extra; |
9337 | int enable = (parms[0] > 0); | 9345 | int enable = (parms[0] > 0); |
9338 | down(&priv->sem); | 9346 | mutex_lock(&priv->mutex); |
9339 | IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]); | 9347 | IPW_DEBUG_WX("SET MONITOR: %d %d\n", enable, parms[1]); |
9340 | if (enable) { | 9348 | if (enable) { |
9341 | if (priv->ieee->iw_mode != IW_MODE_MONITOR) { | 9349 | if (priv->ieee->iw_mode != IW_MODE_MONITOR) { |
@@ -9350,13 +9358,13 @@ static int ipw_wx_set_monitor(struct net_device *dev, | |||
9350 | ipw_set_channel(priv, parms[1]); | 9358 | ipw_set_channel(priv, parms[1]); |
9351 | } else { | 9359 | } else { |
9352 | if (priv->ieee->iw_mode != IW_MODE_MONITOR) { | 9360 | if (priv->ieee->iw_mode != IW_MODE_MONITOR) { |
9353 | up(&priv->sem); | 9361 | mutex_unlock(&priv->mutex); |
9354 | return 0; | 9362 | return 0; |
9355 | } | 9363 | } |
9356 | priv->net_dev->type = ARPHRD_ETHER; | 9364 | priv->net_dev->type = ARPHRD_ETHER; |
9357 | queue_work(priv->workqueue, &priv->adapter_restart); | 9365 | queue_work(priv->workqueue, &priv->adapter_restart); |
9358 | } | 9366 | } |
9359 | up(&priv->sem); | 9367 | mutex_unlock(&priv->mutex); |
9360 | return 0; | 9368 | return 0; |
9361 | } | 9369 | } |
9362 | 9370 | ||
@@ -9386,7 +9394,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, | |||
9386 | 9394 | ||
9387 | IPW_DEBUG_WX("SW_RESET\n"); | 9395 | IPW_DEBUG_WX("SW_RESET\n"); |
9388 | 9396 | ||
9389 | down(&priv->sem); | 9397 | mutex_lock(&priv->mutex); |
9390 | 9398 | ||
9391 | ret = ipw_sw_reset(priv, 0); | 9399 | ret = ipw_sw_reset(priv, 0); |
9392 | if (!ret) { | 9400 | if (!ret) { |
@@ -9398,9 +9406,9 @@ static int ipw_wx_sw_reset(struct net_device *dev, | |||
9398 | * module parameter, so take appropriate action */ | 9406 | * module parameter, so take appropriate action */ |
9399 | ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW); | 9407 | ipw_radio_kill_sw(priv, priv->status & STATUS_RF_KILL_SW); |
9400 | 9408 | ||
9401 | up(&priv->sem); | 9409 | mutex_unlock(&priv->mutex); |
9402 | ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); | 9410 | ieee80211_wx_set_encode(priv->ieee, info, &wrqu_sec, NULL); |
9403 | down(&priv->sem); | 9411 | mutex_lock(&priv->mutex); |
9404 | 9412 | ||
9405 | if (!(priv->status & STATUS_RF_KILL_MASK)) { | 9413 | if (!(priv->status & STATUS_RF_KILL_MASK)) { |
9406 | /* Configuration likely changed -- force [re]association */ | 9414 | /* Configuration likely changed -- force [re]association */ |
@@ -9410,7 +9418,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, | |||
9410 | ipw_associate(priv); | 9418 | ipw_associate(priv); |
9411 | } | 9419 | } |
9412 | 9420 | ||
9413 | up(&priv->sem); | 9421 | mutex_unlock(&priv->mutex); |
9414 | 9422 | ||
9415 | return 0; | 9423 | return 0; |
9416 | } | 9424 | } |
@@ -9586,7 +9594,7 @@ static struct iw_statistics *ipw_get_wireless_stats(struct net_device *dev) | |||
9586 | static void init_sys_config(struct ipw_sys_config *sys_config) | 9594 | static void init_sys_config(struct ipw_sys_config *sys_config) |
9587 | { | 9595 | { |
9588 | memset(sys_config, 0, sizeof(struct ipw_sys_config)); | 9596 | memset(sys_config, 0, sizeof(struct ipw_sys_config)); |
9589 | sys_config->bt_coexistence = 1; /* We may need to look into prvStaBtConfig */ | 9597 | sys_config->bt_coexistence = 0; |
9590 | sys_config->answer_broadcast_ssid_probe = 0; | 9598 | sys_config->answer_broadcast_ssid_probe = 0; |
9591 | sys_config->accept_all_data_frames = 0; | 9599 | sys_config->accept_all_data_frames = 0; |
9592 | sys_config->accept_non_directed_frames = 1; | 9600 | sys_config->accept_non_directed_frames = 1; |
@@ -9607,11 +9615,11 @@ static int ipw_net_open(struct net_device *dev) | |||
9607 | struct ipw_priv *priv = ieee80211_priv(dev); | 9615 | struct ipw_priv *priv = ieee80211_priv(dev); |
9608 | IPW_DEBUG_INFO("dev->open\n"); | 9616 | IPW_DEBUG_INFO("dev->open\n"); |
9609 | /* we should be verifying the device is ready to be opened */ | 9617 | /* we should be verifying the device is ready to be opened */ |
9610 | down(&priv->sem); | 9618 | mutex_lock(&priv->mutex); |
9611 | if (!(priv->status & STATUS_RF_KILL_MASK) && | 9619 | if (!(priv->status & STATUS_RF_KILL_MASK) && |
9612 | (priv->status & STATUS_ASSOCIATED)) | 9620 | (priv->status & STATUS_ASSOCIATED)) |
9613 | netif_start_queue(dev); | 9621 | netif_start_queue(dev); |
9614 | up(&priv->sem); | 9622 | mutex_unlock(&priv->mutex); |
9615 | return 0; | 9623 | return 0; |
9616 | } | 9624 | } |
9617 | 9625 | ||
@@ -9890,13 +9898,13 @@ static int ipw_net_set_mac_address(struct net_device *dev, void *p) | |||
9890 | struct sockaddr *addr = p; | 9898 | struct sockaddr *addr = p; |
9891 | if (!is_valid_ether_addr(addr->sa_data)) | 9899 | if (!is_valid_ether_addr(addr->sa_data)) |
9892 | return -EADDRNOTAVAIL; | 9900 | return -EADDRNOTAVAIL; |
9893 | down(&priv->sem); | 9901 | mutex_lock(&priv->mutex); |
9894 | priv->config |= CFG_CUSTOM_MAC; | 9902 | priv->config |= CFG_CUSTOM_MAC; |
9895 | memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); | 9903 | memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN); |
9896 | printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n", | 9904 | printk(KERN_INFO "%s: Setting MAC to " MAC_FMT "\n", |
9897 | priv->net_dev->name, MAC_ARG(priv->mac_addr)); | 9905 | priv->net_dev->name, MAC_ARG(priv->mac_addr)); |
9898 | queue_work(priv->workqueue, &priv->adapter_restart); | 9906 | queue_work(priv->workqueue, &priv->adapter_restart); |
9899 | up(&priv->sem); | 9907 | mutex_unlock(&priv->mutex); |
9900 | return 0; | 9908 | return 0; |
9901 | } | 9909 | } |
9902 | 9910 | ||
@@ -9940,9 +9948,9 @@ static int ipw_ethtool_get_eeprom(struct net_device *dev, | |||
9940 | 9948 | ||
9941 | if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) | 9949 | if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) |
9942 | return -EINVAL; | 9950 | return -EINVAL; |
9943 | down(&p->sem); | 9951 | mutex_lock(&p->mutex); |
9944 | memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len); | 9952 | memcpy(bytes, &p->eeprom[eeprom->offset], eeprom->len); |
9945 | up(&p->sem); | 9953 | mutex_unlock(&p->mutex); |
9946 | return 0; | 9954 | return 0; |
9947 | } | 9955 | } |
9948 | 9956 | ||
@@ -9954,12 +9962,12 @@ static int ipw_ethtool_set_eeprom(struct net_device *dev, | |||
9954 | 9962 | ||
9955 | if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) | 9963 | if (eeprom->offset + eeprom->len > IPW_EEPROM_IMAGE_SIZE) |
9956 | return -EINVAL; | 9964 | return -EINVAL; |
9957 | down(&p->sem); | 9965 | mutex_lock(&p->mutex); |
9958 | memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len); | 9966 | memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len); |
9959 | for (i = IPW_EEPROM_DATA; | 9967 | for (i = IPW_EEPROM_DATA; |
9960 | i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++) | 9968 | i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++) |
9961 | ipw_write8(p, i, p->eeprom[i]); | 9969 | ipw_write8(p, i, p->eeprom[i]); |
9962 | up(&p->sem); | 9970 | mutex_unlock(&p->mutex); |
9963 | return 0; | 9971 | return 0; |
9964 | } | 9972 | } |
9965 | 9973 | ||
@@ -10054,12 +10062,12 @@ static void ipw_rf_kill(void *adapter) | |||
10054 | static void ipw_bg_rf_kill(void *data) | 10062 | static void ipw_bg_rf_kill(void *data) |
10055 | { | 10063 | { |
10056 | struct ipw_priv *priv = data; | 10064 | struct ipw_priv *priv = data; |
10057 | down(&priv->sem); | 10065 | mutex_lock(&priv->mutex); |
10058 | ipw_rf_kill(data); | 10066 | ipw_rf_kill(data); |
10059 | up(&priv->sem); | 10067 | mutex_unlock(&priv->mutex); |
10060 | } | 10068 | } |
10061 | 10069 | ||
10062 | void ipw_link_up(struct ipw_priv *priv) | 10070 | static void ipw_link_up(struct ipw_priv *priv) |
10063 | { | 10071 | { |
10064 | priv->last_seq_num = -1; | 10072 | priv->last_seq_num = -1; |
10065 | priv->last_frag_num = -1; | 10073 | priv->last_frag_num = -1; |
@@ -10089,12 +10097,12 @@ void ipw_link_up(struct ipw_priv *priv) | |||
10089 | static void ipw_bg_link_up(void *data) | 10097 | static void ipw_bg_link_up(void *data) |
10090 | { | 10098 | { |
10091 | struct ipw_priv *priv = data; | 10099 | struct ipw_priv *priv = data; |
10092 | down(&priv->sem); | 10100 | mutex_lock(&priv->mutex); |
10093 | ipw_link_up(data); | 10101 | ipw_link_up(data); |
10094 | up(&priv->sem); | 10102 | mutex_unlock(&priv->mutex); |
10095 | } | 10103 | } |
10096 | 10104 | ||
10097 | void ipw_link_down(struct ipw_priv *priv) | 10105 | static void ipw_link_down(struct ipw_priv *priv) |
10098 | { | 10106 | { |
10099 | ipw_led_link_down(priv); | 10107 | ipw_led_link_down(priv); |
10100 | netif_carrier_off(priv->net_dev); | 10108 | netif_carrier_off(priv->net_dev); |
@@ -10117,9 +10125,9 @@ void ipw_link_down(struct ipw_priv *priv) | |||
10117 | static void ipw_bg_link_down(void *data) | 10125 | static void ipw_bg_link_down(void *data) |
10118 | { | 10126 | { |
10119 | struct ipw_priv *priv = data; | 10127 | struct ipw_priv *priv = data; |
10120 | down(&priv->sem); | 10128 | mutex_lock(&priv->mutex); |
10121 | ipw_link_down(data); | 10129 | ipw_link_down(data); |
10122 | up(&priv->sem); | 10130 | mutex_unlock(&priv->mutex); |
10123 | } | 10131 | } |
10124 | 10132 | ||
10125 | static int ipw_setup_deferred_work(struct ipw_priv *priv) | 10133 | static int ipw_setup_deferred_work(struct ipw_priv *priv) |
@@ -10292,6 +10300,20 @@ static int ipw_config(struct ipw_priv *priv) | |||
10292 | 10300 | ||
10293 | /* set basic system config settings */ | 10301 | /* set basic system config settings */ |
10294 | init_sys_config(&priv->sys_config); | 10302 | init_sys_config(&priv->sys_config); |
10303 | |||
10304 | /* Support Bluetooth if we have BT h/w on board, and user wants to. | ||
10305 | * Does not support BT priority yet (don't abort or defer our Tx) */ | ||
10306 | if (bt_coexist) { | ||
10307 | unsigned char bt_caps = priv->eeprom[EEPROM_SKU_CAPABILITY]; | ||
10308 | |||
10309 | if (bt_caps & EEPROM_SKU_CAP_BT_CHANNEL_SIG) | ||
10310 | priv->sys_config.bt_coexistence | ||
10311 | |= CFG_BT_COEXISTENCE_SIGNAL_CHNL; | ||
10312 | if (bt_caps & EEPROM_SKU_CAP_BT_OOB) | ||
10313 | priv->sys_config.bt_coexistence | ||
10314 | |= CFG_BT_COEXISTENCE_OOB; | ||
10315 | } | ||
10316 | |||
10295 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) | 10317 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) |
10296 | priv->sys_config.answer_broadcast_ssid_probe = 1; | 10318 | priv->sys_config.answer_broadcast_ssid_probe = 1; |
10297 | else | 10319 | else |
@@ -10782,9 +10804,9 @@ static int ipw_up(struct ipw_priv *priv) | |||
10782 | static void ipw_bg_up(void *data) | 10804 | static void ipw_bg_up(void *data) |
10783 | { | 10805 | { |
10784 | struct ipw_priv *priv = data; | 10806 | struct ipw_priv *priv = data; |
10785 | down(&priv->sem); | 10807 | mutex_lock(&priv->mutex); |
10786 | ipw_up(data); | 10808 | ipw_up(data); |
10787 | up(&priv->sem); | 10809 | mutex_unlock(&priv->mutex); |
10788 | } | 10810 | } |
10789 | 10811 | ||
10790 | static void ipw_deinit(struct ipw_priv *priv) | 10812 | static void ipw_deinit(struct ipw_priv *priv) |
@@ -10853,23 +10875,23 @@ static void ipw_down(struct ipw_priv *priv) | |||
10853 | static void ipw_bg_down(void *data) | 10875 | static void ipw_bg_down(void *data) |
10854 | { | 10876 | { |
10855 | struct ipw_priv *priv = data; | 10877 | struct ipw_priv *priv = data; |
10856 | down(&priv->sem); | 10878 | mutex_lock(&priv->mutex); |
10857 | ipw_down(data); | 10879 | ipw_down(data); |
10858 | up(&priv->sem); | 10880 | mutex_unlock(&priv->mutex); |
10859 | } | 10881 | } |
10860 | 10882 | ||
10861 | /* Called by register_netdev() */ | 10883 | /* Called by register_netdev() */ |
10862 | static int ipw_net_init(struct net_device *dev) | 10884 | static int ipw_net_init(struct net_device *dev) |
10863 | { | 10885 | { |
10864 | struct ipw_priv *priv = ieee80211_priv(dev); | 10886 | struct ipw_priv *priv = ieee80211_priv(dev); |
10865 | down(&priv->sem); | 10887 | mutex_lock(&priv->mutex); |
10866 | 10888 | ||
10867 | if (ipw_up(priv)) { | 10889 | if (ipw_up(priv)) { |
10868 | up(&priv->sem); | 10890 | mutex_unlock(&priv->mutex); |
10869 | return -EIO; | 10891 | return -EIO; |
10870 | } | 10892 | } |
10871 | 10893 | ||
10872 | up(&priv->sem); | 10894 | mutex_unlock(&priv->mutex); |
10873 | return 0; | 10895 | return 0; |
10874 | } | 10896 | } |
10875 | 10897 | ||
@@ -10959,7 +10981,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
10959 | for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) | 10981 | for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) |
10960 | INIT_LIST_HEAD(&priv->ibss_mac_hash[i]); | 10982 | INIT_LIST_HEAD(&priv->ibss_mac_hash[i]); |
10961 | 10983 | ||
10962 | init_MUTEX(&priv->sem); | 10984 | mutex_init(&priv->mutex); |
10963 | if (pci_enable_device(pdev)) { | 10985 | if (pci_enable_device(pdev)) { |
10964 | err = -ENODEV; | 10986 | err = -ENODEV; |
10965 | goto out_free_ieee80211; | 10987 | goto out_free_ieee80211; |
@@ -11017,7 +11039,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
11017 | SET_MODULE_OWNER(net_dev); | 11039 | SET_MODULE_OWNER(net_dev); |
11018 | SET_NETDEV_DEV(net_dev, &pdev->dev); | 11040 | SET_NETDEV_DEV(net_dev, &pdev->dev); |
11019 | 11041 | ||
11020 | down(&priv->sem); | 11042 | mutex_lock(&priv->mutex); |
11021 | 11043 | ||
11022 | priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit; | 11044 | priv->ieee->hard_start_xmit = ipw_net_hard_start_xmit; |
11023 | priv->ieee->set_security = shim__set_security; | 11045 | priv->ieee->set_security = shim__set_security; |
@@ -11050,11 +11072,11 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
11050 | err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); | 11072 | err = sysfs_create_group(&pdev->dev.kobj, &ipw_attribute_group); |
11051 | if (err) { | 11073 | if (err) { |
11052 | IPW_ERROR("failed to create sysfs device attributes\n"); | 11074 | IPW_ERROR("failed to create sysfs device attributes\n"); |
11053 | up(&priv->sem); | 11075 | mutex_unlock(&priv->mutex); |
11054 | goto out_release_irq; | 11076 | goto out_release_irq; |
11055 | } | 11077 | } |
11056 | 11078 | ||
11057 | up(&priv->sem); | 11079 | mutex_unlock(&priv->mutex); |
11058 | err = register_netdev(net_dev); | 11080 | err = register_netdev(net_dev); |
11059 | if (err) { | 11081 | if (err) { |
11060 | IPW_ERROR("failed to register network device\n"); | 11082 | IPW_ERROR("failed to register network device\n"); |
@@ -11091,13 +11113,13 @@ static void ipw_pci_remove(struct pci_dev *pdev) | |||
11091 | if (!priv) | 11113 | if (!priv) |
11092 | return; | 11114 | return; |
11093 | 11115 | ||
11094 | down(&priv->sem); | 11116 | mutex_lock(&priv->mutex); |
11095 | 11117 | ||
11096 | priv->status |= STATUS_EXIT_PENDING; | 11118 | priv->status |= STATUS_EXIT_PENDING; |
11097 | ipw_down(priv); | 11119 | ipw_down(priv); |
11098 | sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); | 11120 | sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group); |
11099 | 11121 | ||
11100 | up(&priv->sem); | 11122 | mutex_unlock(&priv->mutex); |
11101 | 11123 | ||
11102 | unregister_netdev(priv->net_dev); | 11124 | unregister_netdev(priv->net_dev); |
11103 | 11125 | ||
@@ -11281,12 +11303,18 @@ module_param(mode, int, 0444); | |||
11281 | MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)"); | 11303 | MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS)"); |
11282 | #endif | 11304 | #endif |
11283 | 11305 | ||
11306 | module_param(bt_coexist, int, 0444); | ||
11307 | MODULE_PARM_DESC(bt_coexist, "enable bluetooth coexistence (default off)"); | ||
11308 | |||
11284 | module_param(hwcrypto, int, 0444); | 11309 | module_param(hwcrypto, int, 0444); |
11285 | MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default on)"); | 11310 | MODULE_PARM_DESC(hwcrypto, "enable hardware crypto (default off)"); |
11286 | 11311 | ||
11287 | module_param(cmdlog, int, 0444); | 11312 | module_param(cmdlog, int, 0444); |
11288 | MODULE_PARM_DESC(cmdlog, | 11313 | MODULE_PARM_DESC(cmdlog, |
11289 | "allocate a ring buffer for logging firmware commands"); | 11314 | "allocate a ring buffer for logging firmware commands"); |
11290 | 11315 | ||
11316 | module_param(roaming, int, 0444); | ||
11317 | MODULE_PARM_DESC(roaming, "enable roaming support (default on)"); | ||
11318 | |||
11291 | module_exit(ipw_exit); | 11319 | module_exit(ipw_exit); |
11292 | module_init(ipw_init); | 11320 | module_init(ipw_init); |
diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h index e65620a4d79e..5405ba105abf 100644 --- a/drivers/net/wireless/ipw2200.h +++ b/drivers/net/wireless/ipw2200.h | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/moduleparam.h> | 33 | #include <linux/moduleparam.h> |
34 | #include <linux/config.h> | 34 | #include <linux/config.h> |
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | #include <linux/mutex.h> | ||
36 | 37 | ||
37 | #include <linux/pci.h> | 38 | #include <linux/pci.h> |
38 | #include <linux/netdevice.h> | 39 | #include <linux/netdevice.h> |
@@ -46,6 +47,7 @@ | |||
46 | #include <linux/firmware.h> | 47 | #include <linux/firmware.h> |
47 | #include <linux/wireless.h> | 48 | #include <linux/wireless.h> |
48 | #include <linux/dma-mapping.h> | 49 | #include <linux/dma-mapping.h> |
50 | #include <linux/jiffies.h> | ||
49 | #include <asm/io.h> | 51 | #include <asm/io.h> |
50 | 52 | ||
51 | #include <net/ieee80211.h> | 53 | #include <net/ieee80211.h> |
@@ -852,7 +854,7 @@ struct ipw_scan_request_ext { | |||
852 | u16 dwell_time[IPW_SCAN_TYPES]; | 854 | u16 dwell_time[IPW_SCAN_TYPES]; |
853 | } __attribute__ ((packed)); | 855 | } __attribute__ ((packed)); |
854 | 856 | ||
855 | extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) | 857 | static inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) |
856 | { | 858 | { |
857 | if (index % 2) | 859 | if (index % 2) |
858 | return scan->scan_type[index / 2] & 0x0F; | 860 | return scan->scan_type[index / 2] & 0x0F; |
@@ -860,7 +862,7 @@ extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index) | |||
860 | return (scan->scan_type[index / 2] & 0xF0) >> 4; | 862 | return (scan->scan_type[index / 2] & 0xF0) >> 4; |
861 | } | 863 | } |
862 | 864 | ||
863 | extern inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan, | 865 | static inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan, |
864 | u8 index, u8 scan_type) | 866 | u8 index, u8 scan_type) |
865 | { | 867 | { |
866 | if (index % 2) | 868 | if (index % 2) |
@@ -1120,7 +1122,7 @@ struct ipw_priv { | |||
1120 | struct ieee80211_device *ieee; | 1122 | struct ieee80211_device *ieee; |
1121 | 1123 | ||
1122 | spinlock_t lock; | 1124 | spinlock_t lock; |
1123 | struct semaphore sem; | 1125 | struct mutex mutex; |
1124 | 1126 | ||
1125 | /* basic pci-network driver stuff */ | 1127 | /* basic pci-network driver stuff */ |
1126 | struct pci_dev *pci_dev; | 1128 | struct pci_dev *pci_dev; |
@@ -1406,13 +1408,6 @@ do { if (ipw_debug_level & (level)) \ | |||
1406 | * Register bit definitions | 1408 | * Register bit definitions |
1407 | */ | 1409 | */ |
1408 | 1410 | ||
1409 | /* Dino control registers bits */ | ||
1410 | |||
1411 | #define DINO_ENABLE_SYSTEM 0x80 | ||
1412 | #define DINO_ENABLE_CS 0x40 | ||
1413 | #define DINO_RXFIFO_DATA 0x01 | ||
1414 | #define DINO_CONTROL_REG 0x00200000 | ||
1415 | |||
1416 | #define IPW_INTA_RW 0x00000008 | 1411 | #define IPW_INTA_RW 0x00000008 |
1417 | #define IPW_INTA_MASK_R 0x0000000C | 1412 | #define IPW_INTA_MASK_R 0x0000000C |
1418 | #define IPW_INDIRECT_ADDR 0x00000010 | 1413 | #define IPW_INDIRECT_ADDR 0x00000010 |
@@ -1459,6 +1454,11 @@ do { if (ipw_debug_level & (level)) \ | |||
1459 | #define IPW_DOMAIN_0_END 0x1000 | 1454 | #define IPW_DOMAIN_0_END 0x1000 |
1460 | #define CLX_MEM_BAR_SIZE 0x1000 | 1455 | #define CLX_MEM_BAR_SIZE 0x1000 |
1461 | 1456 | ||
1457 | /* Dino/baseband control registers bits */ | ||
1458 | |||
1459 | #define DINO_ENABLE_SYSTEM 0x80 /* 1 = baseband processor on, 0 = reset */ | ||
1460 | #define DINO_ENABLE_CS 0x40 /* 1 = enable ucode load */ | ||
1461 | #define DINO_RXFIFO_DATA 0x01 /* 1 = data available */ | ||
1462 | #define IPW_BASEBAND_CONTROL_STATUS 0X00200000 | 1462 | #define IPW_BASEBAND_CONTROL_STATUS 0X00200000 |
1463 | #define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004 | 1463 | #define IPW_BASEBAND_TX_FIFO_WRITE 0X00200004 |
1464 | #define IPW_BASEBAND_RX_FIFO_READ 0X00200004 | 1464 | #define IPW_BASEBAND_RX_FIFO_READ 0X00200004 |
@@ -1567,13 +1567,18 @@ do { if (ipw_debug_level & (level)) \ | |||
1567 | #define EEPROM_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */ | 1567 | #define EEPROM_BSS_CHANNELS_BG (GET_EEPROM_ADDR(0x2c,LSB)) /* 2 bytes */ |
1568 | #define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */ | 1568 | #define EEPROM_HW_VERSION (GET_EEPROM_ADDR(0x72,LSB)) /* 2 bytes */ |
1569 | 1569 | ||
1570 | /* NIC type as found in the one byte EEPROM_NIC_TYPE offset*/ | 1570 | /* NIC type as found in the one byte EEPROM_NIC_TYPE offset */ |
1571 | #define EEPROM_NIC_TYPE_0 0 | 1571 | #define EEPROM_NIC_TYPE_0 0 |
1572 | #define EEPROM_NIC_TYPE_1 1 | 1572 | #define EEPROM_NIC_TYPE_1 1 |
1573 | #define EEPROM_NIC_TYPE_2 2 | 1573 | #define EEPROM_NIC_TYPE_2 2 |
1574 | #define EEPROM_NIC_TYPE_3 3 | 1574 | #define EEPROM_NIC_TYPE_3 3 |
1575 | #define EEPROM_NIC_TYPE_4 4 | 1575 | #define EEPROM_NIC_TYPE_4 4 |
1576 | 1576 | ||
1577 | /* Bluetooth Coexistence capabilities as found in EEPROM_SKU_CAPABILITY */ | ||
1578 | #define EEPROM_SKU_CAP_BT_CHANNEL_SIG 0x01 /* we can tell BT our channel # */ | ||
1579 | #define EEPROM_SKU_CAP_BT_PRIORITY 0x02 /* BT can take priority over us */ | ||
1580 | #define EEPROM_SKU_CAP_BT_OOB 0x04 /* we can signal BT out-of-band */ | ||
1581 | |||
1577 | #define FW_MEM_REG_LOWER_BOUND 0x00300000 | 1582 | #define FW_MEM_REG_LOWER_BOUND 0x00300000 |
1578 | #define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40) | 1583 | #define FW_MEM_REG_EEPROM_ACCESS (FW_MEM_REG_LOWER_BOUND + 0x40) |
1579 | #define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04) | 1584 | #define IPW_EVENT_REG (FW_MEM_REG_LOWER_BOUND + 0x04) |
@@ -1658,9 +1663,10 @@ enum { | |||
1658 | IPW_FW_ERROR_FATAL_ERROR | 1663 | IPW_FW_ERROR_FATAL_ERROR |
1659 | }; | 1664 | }; |
1660 | 1665 | ||
1661 | #define AUTH_OPEN 0 | 1666 | #define AUTH_OPEN 0 |
1662 | #define AUTH_SHARED_KEY 1 | 1667 | #define AUTH_SHARED_KEY 1 |
1663 | #define AUTH_IGNORE 3 | 1668 | #define AUTH_LEAP 2 |
1669 | #define AUTH_IGNORE 3 | ||
1664 | 1670 | ||
1665 | #define HC_ASSOCIATE 0 | 1671 | #define HC_ASSOCIATE 0 |
1666 | #define HC_REASSOCIATE 1 | 1672 | #define HC_REASSOCIATE 1 |
@@ -1860,7 +1866,7 @@ struct host_cmd { | |||
1860 | u8 cmd; | 1866 | u8 cmd; |
1861 | u8 len; | 1867 | u8 len; |
1862 | u16 reserved; | 1868 | u16 reserved; |
1863 | u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH]; | 1869 | u32 *param; |
1864 | } __attribute__ ((packed)); | 1870 | } __attribute__ ((packed)); |
1865 | 1871 | ||
1866 | struct ipw_cmd_log { | 1872 | struct ipw_cmd_log { |
@@ -1869,21 +1875,23 @@ struct ipw_cmd_log { | |||
1869 | struct host_cmd cmd; | 1875 | struct host_cmd cmd; |
1870 | }; | 1876 | }; |
1871 | 1877 | ||
1872 | #define CFG_BT_COEXISTENCE_MIN 0x00 | 1878 | /* SysConfig command parameters ... */ |
1873 | #define CFG_BT_COEXISTENCE_DEFER 0x02 | 1879 | /* bt_coexistence param */ |
1874 | #define CFG_BT_COEXISTENCE_KILL 0x04 | 1880 | #define CFG_BT_COEXISTENCE_SIGNAL_CHNL 0x01 /* tell BT our chnl # */ |
1875 | #define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 | 1881 | #define CFG_BT_COEXISTENCE_DEFER 0x02 /* defer our Tx if BT traffic */ |
1876 | #define CFG_BT_COEXISTENCE_OOB 0x10 | 1882 | #define CFG_BT_COEXISTENCE_KILL 0x04 /* kill our Tx if BT traffic */ |
1877 | #define CFG_BT_COEXISTENCE_MAX 0xFF | 1883 | #define CFG_BT_COEXISTENCE_WME_OVER_BT 0x08 /* multimedia extensions */ |
1878 | #define CFG_BT_COEXISTENCE_DEF 0x80 /* read Bt from EEPROM */ | 1884 | #define CFG_BT_COEXISTENCE_OOB 0x10 /* signal BT via out-of-band */ |
1879 | 1885 | ||
1880 | #define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x0 | 1886 | /* clear-to-send to self param */ |
1881 | #define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x1 | 1887 | #define CFG_CTS_TO_ITSELF_ENABLED_MIN 0x00 |
1888 | #define CFG_CTS_TO_ITSELF_ENABLED_MAX 0x01 | ||
1882 | #define CFG_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN | 1889 | #define CFG_CTS_TO_ITSELF_ENABLED_DEF CFG_CTS_TO_ITSELF_ENABLED_MIN |
1883 | 1890 | ||
1884 | #define CFG_SYS_ANTENNA_BOTH 0x000 | 1891 | /* Antenna diversity param (h/w can select best antenna, based on signal) */ |
1885 | #define CFG_SYS_ANTENNA_A 0x001 | 1892 | #define CFG_SYS_ANTENNA_BOTH 0x00 /* NIC selects best antenna */ |
1886 | #define CFG_SYS_ANTENNA_B 0x003 | 1893 | #define CFG_SYS_ANTENNA_A 0x01 /* force antenna A */ |
1894 | #define CFG_SYS_ANTENNA_B 0x03 /* force antenna B */ | ||
1887 | 1895 | ||
1888 | /* | 1896 | /* |
1889 | * The definitions below were lifted off the ipw2100 driver, which only | 1897 | * The definitions below were lifted off the ipw2100 driver, which only |
diff --git a/drivers/net/wireless/netwave_cs.c b/drivers/net/wireless/netwave_cs.c index bf6271ee387a..75ce6ddb0cf5 100644 --- a/drivers/net/wireless/netwave_cs.c +++ b/drivers/net/wireless/netwave_cs.c | |||
@@ -55,10 +55,8 @@ | |||
55 | #include <linux/etherdevice.h> | 55 | #include <linux/etherdevice.h> |
56 | #include <linux/skbuff.h> | 56 | #include <linux/skbuff.h> |
57 | #include <linux/bitops.h> | 57 | #include <linux/bitops.h> |
58 | #ifdef CONFIG_NET_RADIO | ||
59 | #include <linux/wireless.h> | 58 | #include <linux/wireless.h> |
60 | #include <net/iw_handler.h> | 59 | #include <net/iw_handler.h> |
61 | #endif | ||
62 | 60 | ||
63 | #include <pcmcia/cs_types.h> | 61 | #include <pcmcia/cs_types.h> |
64 | #include <pcmcia/cs.h> | 62 | #include <pcmcia/cs.h> |
diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c index 18baacfc5a2c..18a44580b53b 100644 --- a/drivers/net/wireless/strip.c +++ b/drivers/net/wireless/strip.c | |||
@@ -112,7 +112,7 @@ static const char StripVersion[] = "1.3A-STUART.CHESHIRE"; | |||
112 | #include <linux/ip.h> | 112 | #include <linux/ip.h> |
113 | #include <linux/tcp.h> | 113 | #include <linux/tcp.h> |
114 | #include <linux/time.h> | 114 | #include <linux/time.h> |
115 | 115 | #include <linux/jiffies.h> | |
116 | 116 | ||
117 | /************************************************************************/ | 117 | /************************************************************************/ |
118 | /* Useful structures and definitions */ | 118 | /* Useful structures and definitions */ |
@@ -1569,7 +1569,7 @@ static int strip_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1569 | del_timer(&strip_info->idle_timer); | 1569 | del_timer(&strip_info->idle_timer); |
1570 | 1570 | ||
1571 | 1571 | ||
1572 | if (jiffies - strip_info->pps_timer > HZ) { | 1572 | if (time_after(jiffies, strip_info->pps_timer + HZ)) { |
1573 | unsigned long t = jiffies - strip_info->pps_timer; | 1573 | unsigned long t = jiffies - strip_info->pps_timer; |
1574 | unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t / 2) / t; | 1574 | unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t / 2) / t; |
1575 | unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t / 2) / t; | 1575 | unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t / 2) / t; |
diff --git a/drivers/net/wireless/wavelan.p.h b/drivers/net/wireless/wavelan.p.h index 166e28b9a4f7..5cb0bc8bb128 100644 --- a/drivers/net/wireless/wavelan.p.h +++ b/drivers/net/wireless/wavelan.p.h | |||
@@ -98,11 +98,7 @@ | |||
98 | * characteristics of the hardware. Applications such as mobile IP may | 98 | * characteristics of the hardware. Applications such as mobile IP may |
99 | * take advantage of it. | 99 | * take advantage of it. |
100 | * | 100 | * |
101 | * You will need to enable the CONFIG_NET_RADIO define in the kernel | 101 | * It might be a good idea as well to fetch the wireless tools to |
102 | * configuration to enable the wireless extensions (this is the one | ||
103 | * giving access to the radio network device choice). | ||
104 | * | ||
105 | * It might also be a good idea as well to fetch the wireless tools to | ||
106 | * configure the device and play a bit. | 102 | * configure the device and play a bit. |
107 | */ | 103 | */ |
108 | 104 | ||
diff --git a/drivers/net/wireless/wavelan_cs.p.h b/drivers/net/wireless/wavelan_cs.p.h index f2d597568151..451f6271dcbc 100644 --- a/drivers/net/wireless/wavelan_cs.p.h +++ b/drivers/net/wireless/wavelan_cs.p.h | |||
@@ -99,11 +99,7 @@ | |||
99 | * caracteristics of the hardware in a standard way and support for | 99 | * caracteristics of the hardware in a standard way and support for |
100 | * applications for taking advantage of it (like Mobile IP). | 100 | * applications for taking advantage of it (like Mobile IP). |
101 | * | 101 | * |
102 | * You will need to enable the CONFIG_NET_RADIO define in the kernel | 102 | * It might be a good idea as well to fetch the wireless tools to |
103 | * configuration to enable the wireless extensions (this is the one | ||
104 | * giving access to the radio network device choice). | ||
105 | * | ||
106 | * It might also be a good idea as well to fetch the wireless tools to | ||
107 | * configure the device and play a bit. | 103 | * configure the device and play a bit. |
108 | */ | 104 | */ |
109 | 105 | ||
@@ -440,11 +436,8 @@ | |||
440 | #include <linux/ioport.h> | 436 | #include <linux/ioport.h> |
441 | #include <linux/fcntl.h> | 437 | #include <linux/fcntl.h> |
442 | #include <linux/ethtool.h> | 438 | #include <linux/ethtool.h> |
443 | |||
444 | #ifdef CONFIG_NET_RADIO | ||
445 | #include <linux/wireless.h> /* Wireless extensions */ | 439 | #include <linux/wireless.h> /* Wireless extensions */ |
446 | #include <net/iw_handler.h> /* New driver API */ | 440 | #include <net/iw_handler.h> /* New driver API */ |
447 | #endif | ||
448 | 441 | ||
449 | /* Pcmcia headers that we need */ | 442 | /* Pcmcia headers that we need */ |
450 | #include <pcmcia/cs_types.h> | 443 | #include <pcmcia/cs_types.h> |