diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-28 12:05:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-28 12:05:25 -0400 |
commit | e5dfa9282f3db461a896a6692b529e1823ba98c6 (patch) | |
tree | 574d23cebc57c657373b0e1b6692c047aba8dd6e /drivers/net/wireless/hostap | |
parent | 5dd962494f76fb3ef1196cd420b5d6260d7a3766 (diff) | |
parent | b2ab040db85835e54c7559533df7f85902617926 (diff) |
Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
Diffstat (limited to 'drivers/net/wireless/hostap')
-rw-r--r-- | drivers/net/wireless/hostap/hostap.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_80211_rx.c | 43 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_80211_tx.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_ap.c | 80 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_ap.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 50 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_hw.c | 22 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_ioctl.c | 23 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_pci.c | 21 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_plx.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_wlan.h | 2 |
11 files changed, 126 insertions, 166 deletions
diff --git a/drivers/net/wireless/hostap/hostap.c b/drivers/net/wireless/hostap/hostap.c index e7f5821b4942..6a96cd9f2685 100644 --- a/drivers/net/wireless/hostap/hostap.c +++ b/drivers/net/wireless/hostap/hostap.c | |||
@@ -716,9 +716,6 @@ static int prism2_close(struct net_device *dev) | |||
716 | hostap_deauth_all_stas(dev, local->ap, 1); | 716 | hostap_deauth_all_stas(dev, local->ap, 1); |
717 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ | 717 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ |
718 | 718 | ||
719 | if (local->func->dev_close && local->func->dev_close(local)) | ||
720 | return 0; | ||
721 | |||
722 | if (dev == local->dev) { | 719 | if (dev == local->dev) { |
723 | local->func->hw_shutdown(dev, HOSTAP_HW_ENABLE_CMDCOMPL); | 720 | local->func->hw_shutdown(dev, HOSTAP_HW_ENABLE_CMDCOMPL); |
724 | } | 721 | } |
@@ -766,9 +763,6 @@ static int prism2_open(struct net_device *dev) | |||
766 | local->hw_downloading) | 763 | local->hw_downloading) |
767 | return -ENODEV; | 764 | return -ENODEV; |
768 | 765 | ||
769 | if (local->func->dev_open && local->func->dev_open(local)) | ||
770 | return 1; | ||
771 | |||
772 | if (!try_module_get(local->hw_module)) | 766 | if (!try_module_get(local->hw_module)) |
773 | return -ENODEV; | 767 | return -ENODEV; |
774 | local->num_dev_open++; | 768 | local->num_dev_open++; |
diff --git a/drivers/net/wireless/hostap/hostap_80211_rx.c b/drivers/net/wireless/hostap/hostap_80211_rx.c index b0501243b175..ffac50899454 100644 --- a/drivers/net/wireless/hostap/hostap_80211_rx.c +++ b/drivers/net/wireless/hostap/hostap_80211_rx.c | |||
@@ -6,10 +6,10 @@ | |||
6 | void hostap_dump_rx_80211(const char *name, struct sk_buff *skb, | 6 | void hostap_dump_rx_80211(const char *name, struct sk_buff *skb, |
7 | struct hostap_80211_rx_status *rx_stats) | 7 | struct hostap_80211_rx_status *rx_stats) |
8 | { | 8 | { |
9 | struct ieee80211_hdr *hdr; | 9 | struct ieee80211_hdr_4addr *hdr; |
10 | u16 fc; | 10 | u16 fc; |
11 | 11 | ||
12 | hdr = (struct ieee80211_hdr *) skb->data; | 12 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
13 | 13 | ||
14 | printk(KERN_DEBUG "%s: RX signal=%d noise=%d rate=%d len=%d " | 14 | printk(KERN_DEBUG "%s: RX signal=%d noise=%d rate=%d len=%d " |
15 | "jiffies=%ld\n", | 15 | "jiffies=%ld\n", |
@@ -51,7 +51,7 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, | |||
51 | int hdrlen, phdrlen, head_need, tail_need; | 51 | int hdrlen, phdrlen, head_need, tail_need; |
52 | u16 fc; | 52 | u16 fc; |
53 | int prism_header, ret; | 53 | int prism_header, ret; |
54 | struct ieee80211_hdr *hdr; | 54 | struct ieee80211_hdr_4addr *hdr; |
55 | 55 | ||
56 | iface = netdev_priv(dev); | 56 | iface = netdev_priv(dev); |
57 | local = iface->local; | 57 | local = iface->local; |
@@ -70,7 +70,7 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, | |||
70 | phdrlen = 0; | 70 | phdrlen = 0; |
71 | } | 71 | } |
72 | 72 | ||
73 | hdr = (struct ieee80211_hdr *) skb->data; | 73 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
74 | fc = le16_to_cpu(hdr->frame_ctl); | 74 | fc = le16_to_cpu(hdr->frame_ctl); |
75 | 75 | ||
76 | if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) { | 76 | if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) { |
@@ -215,7 +215,7 @@ prism2_frag_cache_find(local_info_t *local, unsigned int seq, | |||
215 | 215 | ||
216 | /* Called only as a tasklet (software IRQ) */ | 216 | /* Called only as a tasklet (software IRQ) */ |
217 | static struct sk_buff * | 217 | static struct sk_buff * |
218 | prism2_frag_cache_get(local_info_t *local, struct ieee80211_hdr *hdr) | 218 | prism2_frag_cache_get(local_info_t *local, struct ieee80211_hdr_4addr *hdr) |
219 | { | 219 | { |
220 | struct sk_buff *skb = NULL; | 220 | struct sk_buff *skb = NULL; |
221 | u16 sc; | 221 | u16 sc; |
@@ -229,7 +229,7 @@ prism2_frag_cache_get(local_info_t *local, struct ieee80211_hdr *hdr) | |||
229 | if (frag == 0) { | 229 | if (frag == 0) { |
230 | /* Reserve enough space to fit maximum frame length */ | 230 | /* Reserve enough space to fit maximum frame length */ |
231 | skb = dev_alloc_skb(local->dev->mtu + | 231 | skb = dev_alloc_skb(local->dev->mtu + |
232 | sizeof(struct ieee80211_hdr) + | 232 | sizeof(struct ieee80211_hdr_4addr) + |
233 | 8 /* LLC */ + | 233 | 8 /* LLC */ + |
234 | 2 /* alignment */ + | 234 | 2 /* alignment */ + |
235 | 8 /* WEP */ + ETH_ALEN /* WDS */); | 235 | 8 /* WEP */ + ETH_ALEN /* WDS */); |
@@ -267,7 +267,7 @@ prism2_frag_cache_get(local_info_t *local, struct ieee80211_hdr *hdr) | |||
267 | 267 | ||
268 | /* Called only as a tasklet (software IRQ) */ | 268 | /* Called only as a tasklet (software IRQ) */ |
269 | static int prism2_frag_cache_invalidate(local_info_t *local, | 269 | static int prism2_frag_cache_invalidate(local_info_t *local, |
270 | struct ieee80211_hdr *hdr) | 270 | struct ieee80211_hdr_4addr *hdr) |
271 | { | 271 | { |
272 | u16 sc; | 272 | u16 sc; |
273 | unsigned int seq; | 273 | unsigned int seq; |
@@ -441,7 +441,7 @@ hostap_rx_frame_mgmt(local_info_t *local, struct sk_buff *skb, | |||
441 | u16 stype) | 441 | u16 stype) |
442 | { | 442 | { |
443 | if (local->iw_mode == IW_MODE_MASTER) { | 443 | if (local->iw_mode == IW_MODE_MASTER) { |
444 | hostap_update_sta_ps(local, (struct ieee80211_hdr *) | 444 | hostap_update_sta_ps(local, (struct ieee80211_hdr_4addr *) |
445 | skb->data); | 445 | skb->data); |
446 | } | 446 | } |
447 | 447 | ||
@@ -520,7 +520,7 @@ static inline struct net_device *prism2_rx_get_wds(local_info_t *local, | |||
520 | 520 | ||
521 | 521 | ||
522 | static inline int | 522 | static inline int |
523 | hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr *hdr, | 523 | hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr_4addr *hdr, |
524 | u16 fc, struct net_device **wds) | 524 | u16 fc, struct net_device **wds) |
525 | { | 525 | { |
526 | /* FIX: is this really supposed to accept WDS frames only in Master | 526 | /* FIX: is this really supposed to accept WDS frames only in Master |
@@ -579,13 +579,13 @@ static int hostap_is_eapol_frame(local_info_t *local, struct sk_buff *skb) | |||
579 | { | 579 | { |
580 | struct net_device *dev = local->dev; | 580 | struct net_device *dev = local->dev; |
581 | u16 fc, ethertype; | 581 | u16 fc, ethertype; |
582 | struct ieee80211_hdr *hdr; | 582 | struct ieee80211_hdr_4addr *hdr; |
583 | u8 *pos; | 583 | u8 *pos; |
584 | 584 | ||
585 | if (skb->len < 24) | 585 | if (skb->len < 24) |
586 | return 0; | 586 | return 0; |
587 | 587 | ||
588 | hdr = (struct ieee80211_hdr *) skb->data; | 588 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
589 | fc = le16_to_cpu(hdr->frame_ctl); | 589 | fc = le16_to_cpu(hdr->frame_ctl); |
590 | 590 | ||
591 | /* check that the frame is unicast frame to us */ | 591 | /* check that the frame is unicast frame to us */ |
@@ -619,13 +619,13 @@ static inline int | |||
619 | hostap_rx_frame_decrypt(local_info_t *local, struct sk_buff *skb, | 619 | hostap_rx_frame_decrypt(local_info_t *local, struct sk_buff *skb, |
620 | struct ieee80211_crypt_data *crypt) | 620 | struct ieee80211_crypt_data *crypt) |
621 | { | 621 | { |
622 | struct ieee80211_hdr *hdr; | 622 | struct ieee80211_hdr_4addr *hdr; |
623 | int res, hdrlen; | 623 | int res, hdrlen; |
624 | 624 | ||
625 | if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) | 625 | if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) |
626 | return 0; | 626 | return 0; |
627 | 627 | ||
628 | hdr = (struct ieee80211_hdr *) skb->data; | 628 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
629 | hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); | 629 | hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); |
630 | 630 | ||
631 | if (local->tkip_countermeasures && | 631 | if (local->tkip_countermeasures && |
@@ -658,13 +658,13 @@ static inline int | |||
658 | hostap_rx_frame_decrypt_msdu(local_info_t *local, struct sk_buff *skb, | 658 | hostap_rx_frame_decrypt_msdu(local_info_t *local, struct sk_buff *skb, |
659 | int keyidx, struct ieee80211_crypt_data *crypt) | 659 | int keyidx, struct ieee80211_crypt_data *crypt) |
660 | { | 660 | { |
661 | struct ieee80211_hdr *hdr; | 661 | struct ieee80211_hdr_4addr *hdr; |
662 | int res, hdrlen; | 662 | int res, hdrlen; |
663 | 663 | ||
664 | if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) | 664 | if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) |
665 | return 0; | 665 | return 0; |
666 | 666 | ||
667 | hdr = (struct ieee80211_hdr *) skb->data; | 667 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
668 | hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); | 668 | hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); |
669 | 669 | ||
670 | atomic_inc(&crypt->refcnt); | 670 | atomic_inc(&crypt->refcnt); |
@@ -689,7 +689,7 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | |||
689 | { | 689 | { |
690 | struct hostap_interface *iface; | 690 | struct hostap_interface *iface; |
691 | local_info_t *local; | 691 | local_info_t *local; |
692 | struct ieee80211_hdr *hdr; | 692 | struct ieee80211_hdr_4addr *hdr; |
693 | size_t hdrlen; | 693 | size_t hdrlen; |
694 | u16 fc, type, stype, sc; | 694 | u16 fc, type, stype, sc; |
695 | struct net_device *wds = NULL; | 695 | struct net_device *wds = NULL; |
@@ -716,7 +716,7 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | |||
716 | dev = local->ddev; | 716 | dev = local->ddev; |
717 | iface = netdev_priv(dev); | 717 | iface = netdev_priv(dev); |
718 | 718 | ||
719 | hdr = (struct ieee80211_hdr *) skb->data; | 719 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
720 | stats = hostap_get_stats(dev); | 720 | stats = hostap_get_stats(dev); |
721 | 721 | ||
722 | if (skb->len < 10) | 722 | if (skb->len < 10) |
@@ -737,7 +737,8 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | |||
737 | struct iw_quality wstats; | 737 | struct iw_quality wstats; |
738 | wstats.level = rx_stats->signal; | 738 | wstats.level = rx_stats->signal; |
739 | wstats.noise = rx_stats->noise; | 739 | wstats.noise = rx_stats->noise; |
740 | wstats.updated = 6; /* No qual value */ | 740 | wstats.updated = IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_UPDATED |
741 | | IW_QUAL_QUAL_INVALID | IW_QUAL_DBM; | ||
741 | /* Update spy records */ | 742 | /* Update spy records */ |
742 | wireless_spy_update(dev, hdr->addr2, &wstats); | 743 | wireless_spy_update(dev, hdr->addr2, &wstats); |
743 | } | 744 | } |
@@ -889,7 +890,7 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | |||
889 | if (local->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && | 890 | if (local->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && |
890 | (keyidx = hostap_rx_frame_decrypt(local, skb, crypt)) < 0) | 891 | (keyidx = hostap_rx_frame_decrypt(local, skb, crypt)) < 0) |
891 | goto rx_dropped; | 892 | goto rx_dropped; |
892 | hdr = (struct ieee80211_hdr *) skb->data; | 893 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
893 | 894 | ||
894 | /* skb: hdr + (possibly fragmented) plaintext payload */ | 895 | /* skb: hdr + (possibly fragmented) plaintext payload */ |
895 | 896 | ||
@@ -941,7 +942,7 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | |||
941 | /* this was the last fragment and the frame will be | 942 | /* this was the last fragment and the frame will be |
942 | * delivered, so remove skb from fragment cache */ | 943 | * delivered, so remove skb from fragment cache */ |
943 | skb = frag_skb; | 944 | skb = frag_skb; |
944 | hdr = (struct ieee80211_hdr *) skb->data; | 945 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
945 | prism2_frag_cache_invalidate(local, hdr); | 946 | prism2_frag_cache_invalidate(local, hdr); |
946 | } | 947 | } |
947 | 948 | ||
@@ -952,7 +953,7 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | |||
952 | hostap_rx_frame_decrypt_msdu(local, skb, keyidx, crypt)) | 953 | hostap_rx_frame_decrypt_msdu(local, skb, keyidx, crypt)) |
953 | goto rx_dropped; | 954 | goto rx_dropped; |
954 | 955 | ||
955 | hdr = (struct ieee80211_hdr *) skb->data; | 956 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
956 | if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !local->open_wep) { | 957 | if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !local->open_wep) { |
957 | if (local->ieee_802_1x && | 958 | if (local->ieee_802_1x && |
958 | hostap_is_eapol_frame(local, skb)) { | 959 | hostap_is_eapol_frame(local, skb)) { |
diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c index 6358015f6526..9d24f8a38ac5 100644 --- a/drivers/net/wireless/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c | |||
@@ -1,9 +1,9 @@ | |||
1 | void hostap_dump_tx_80211(const char *name, struct sk_buff *skb) | 1 | void hostap_dump_tx_80211(const char *name, struct sk_buff *skb) |
2 | { | 2 | { |
3 | struct ieee80211_hdr *hdr; | 3 | struct ieee80211_hdr_4addr *hdr; |
4 | u16 fc; | 4 | u16 fc; |
5 | 5 | ||
6 | hdr = (struct ieee80211_hdr *) skb->data; | 6 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
7 | 7 | ||
8 | printk(KERN_DEBUG "%s: TX len=%d jiffies=%ld\n", | 8 | printk(KERN_DEBUG "%s: TX len=%d jiffies=%ld\n", |
9 | name, skb->len, jiffies); | 9 | name, skb->len, jiffies); |
@@ -41,7 +41,7 @@ int hostap_data_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
41 | struct hostap_interface *iface; | 41 | struct hostap_interface *iface; |
42 | local_info_t *local; | 42 | local_info_t *local; |
43 | int need_headroom, need_tailroom = 0; | 43 | int need_headroom, need_tailroom = 0; |
44 | struct ieee80211_hdr hdr; | 44 | struct ieee80211_hdr_4addr hdr; |
45 | u16 fc, ethertype = 0; | 45 | u16 fc, ethertype = 0; |
46 | enum { | 46 | enum { |
47 | WDS_NO = 0, WDS_OWN_FRAME, WDS_COMPLIANT_FRAME | 47 | WDS_NO = 0, WDS_OWN_FRAME, WDS_COMPLIANT_FRAME |
@@ -244,7 +244,7 @@ int hostap_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
244 | struct hostap_interface *iface; | 244 | struct hostap_interface *iface; |
245 | local_info_t *local; | 245 | local_info_t *local; |
246 | struct hostap_skb_tx_data *meta; | 246 | struct hostap_skb_tx_data *meta; |
247 | struct ieee80211_hdr *hdr; | 247 | struct ieee80211_hdr_4addr *hdr; |
248 | u16 fc; | 248 | u16 fc; |
249 | 249 | ||
250 | iface = netdev_priv(dev); | 250 | iface = netdev_priv(dev); |
@@ -266,7 +266,7 @@ int hostap_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
266 | meta->iface = iface; | 266 | meta->iface = iface; |
267 | 267 | ||
268 | if (skb->len >= IEEE80211_DATA_HDR3_LEN + sizeof(rfc1042_header) + 2) { | 268 | if (skb->len >= IEEE80211_DATA_HDR3_LEN + sizeof(rfc1042_header) + 2) { |
269 | hdr = (struct ieee80211_hdr *) skb->data; | 269 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
270 | fc = le16_to_cpu(hdr->frame_ctl); | 270 | fc = le16_to_cpu(hdr->frame_ctl); |
271 | if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA && | 271 | if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA && |
272 | WLAN_FC_GET_STYPE(fc) == IEEE80211_STYPE_DATA) { | 272 | WLAN_FC_GET_STYPE(fc) == IEEE80211_STYPE_DATA) { |
@@ -289,7 +289,7 @@ struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
289 | { | 289 | { |
290 | struct hostap_interface *iface; | 290 | struct hostap_interface *iface; |
291 | local_info_t *local; | 291 | local_info_t *local; |
292 | struct ieee80211_hdr *hdr; | 292 | struct ieee80211_hdr_4addr *hdr; |
293 | u16 fc; | 293 | u16 fc; |
294 | int hdr_len, res; | 294 | int hdr_len, res; |
295 | 295 | ||
@@ -303,7 +303,7 @@ struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
303 | 303 | ||
304 | if (local->tkip_countermeasures && | 304 | if (local->tkip_countermeasures && |
305 | crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { | 305 | crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { |
306 | hdr = (struct ieee80211_hdr *) skb->data; | 306 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
307 | if (net_ratelimit()) { | 307 | if (net_ratelimit()) { |
308 | printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " | 308 | printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " |
309 | "TX packet to " MACSTR "\n", | 309 | "TX packet to " MACSTR "\n", |
@@ -317,15 +317,15 @@ struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
317 | if (skb == NULL) | 317 | if (skb == NULL) |
318 | return NULL; | 318 | return NULL; |
319 | 319 | ||
320 | if ((skb_headroom(skb) < crypt->ops->extra_prefix_len || | 320 | if ((skb_headroom(skb) < crypt->ops->extra_mpdu_prefix_len || |
321 | skb_tailroom(skb) < crypt->ops->extra_postfix_len) && | 321 | skb_tailroom(skb) < crypt->ops->extra_mpdu_postfix_len) && |
322 | pskb_expand_head(skb, crypt->ops->extra_prefix_len, | 322 | pskb_expand_head(skb, crypt->ops->extra_mpdu_prefix_len, |
323 | crypt->ops->extra_postfix_len, GFP_ATOMIC)) { | 323 | crypt->ops->extra_mpdu_postfix_len, GFP_ATOMIC)) { |
324 | kfree_skb(skb); | 324 | kfree_skb(skb); |
325 | return NULL; | 325 | return NULL; |
326 | } | 326 | } |
327 | 327 | ||
328 | hdr = (struct ieee80211_hdr *) skb->data; | 328 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
329 | fc = le16_to_cpu(hdr->frame_ctl); | 329 | fc = le16_to_cpu(hdr->frame_ctl); |
330 | hdr_len = hostap_80211_get_hdrlen(fc); | 330 | hdr_len = hostap_80211_get_hdrlen(fc); |
331 | 331 | ||
@@ -360,7 +360,7 @@ int hostap_master_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
360 | ap_tx_ret tx_ret; | 360 | ap_tx_ret tx_ret; |
361 | struct hostap_skb_tx_data *meta; | 361 | struct hostap_skb_tx_data *meta; |
362 | int no_encrypt = 0; | 362 | int no_encrypt = 0; |
363 | struct ieee80211_hdr *hdr; | 363 | struct ieee80211_hdr_4addr *hdr; |
364 | 364 | ||
365 | iface = netdev_priv(dev); | 365 | iface = netdev_priv(dev); |
366 | local = iface->local; | 366 | local = iface->local; |
@@ -403,7 +403,7 @@ int hostap_master_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
403 | tx_ret = hostap_handle_sta_tx(local, &tx); | 403 | tx_ret = hostap_handle_sta_tx(local, &tx); |
404 | skb = tx.skb; | 404 | skb = tx.skb; |
405 | meta = (struct hostap_skb_tx_data *) skb->cb; | 405 | meta = (struct hostap_skb_tx_data *) skb->cb; |
406 | hdr = (struct ieee80211_hdr *) skb->data; | 406 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
407 | fc = le16_to_cpu(hdr->frame_ctl); | 407 | fc = le16_to_cpu(hdr->frame_ctl); |
408 | switch (tx_ret) { | 408 | switch (tx_ret) { |
409 | case AP_TX_CONTINUE: | 409 | case AP_TX_CONTINUE: |
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c index 930cef8367f2..9da94ab7f05f 100644 --- a/drivers/net/wireless/hostap/hostap_ap.c +++ b/drivers/net/wireless/hostap/hostap_ap.c | |||
@@ -591,14 +591,14 @@ static void hostap_ap_tx_cb(struct sk_buff *skb, int ok, void *data) | |||
591 | { | 591 | { |
592 | struct ap_data *ap = data; | 592 | struct ap_data *ap = data; |
593 | u16 fc; | 593 | u16 fc; |
594 | struct ieee80211_hdr *hdr; | 594 | struct ieee80211_hdr_4addr *hdr; |
595 | 595 | ||
596 | if (!ap->local->hostapd || !ap->local->apdev) { | 596 | if (!ap->local->hostapd || !ap->local->apdev) { |
597 | dev_kfree_skb(skb); | 597 | dev_kfree_skb(skb); |
598 | return; | 598 | return; |
599 | } | 599 | } |
600 | 600 | ||
601 | hdr = (struct ieee80211_hdr *) skb->data; | 601 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
602 | fc = le16_to_cpu(hdr->frame_ctl); | 602 | fc = le16_to_cpu(hdr->frame_ctl); |
603 | 603 | ||
604 | /* Pass the TX callback frame to the hostapd; use 802.11 header version | 604 | /* Pass the TX callback frame to the hostapd; use 802.11 header version |
@@ -623,7 +623,7 @@ static void hostap_ap_tx_cb_auth(struct sk_buff *skb, int ok, void *data) | |||
623 | { | 623 | { |
624 | struct ap_data *ap = data; | 624 | struct ap_data *ap = data; |
625 | struct net_device *dev = ap->local->dev; | 625 | struct net_device *dev = ap->local->dev; |
626 | struct ieee80211_hdr *hdr; | 626 | struct ieee80211_hdr_4addr *hdr; |
627 | u16 fc, *pos, auth_alg, auth_transaction, status; | 627 | u16 fc, *pos, auth_alg, auth_transaction, status; |
628 | struct sta_info *sta = NULL; | 628 | struct sta_info *sta = NULL; |
629 | char *txt = NULL; | 629 | char *txt = NULL; |
@@ -633,7 +633,7 @@ static void hostap_ap_tx_cb_auth(struct sk_buff *skb, int ok, void *data) | |||
633 | return; | 633 | return; |
634 | } | 634 | } |
635 | 635 | ||
636 | hdr = (struct ieee80211_hdr *) skb->data; | 636 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
637 | fc = le16_to_cpu(hdr->frame_ctl); | 637 | fc = le16_to_cpu(hdr->frame_ctl); |
638 | if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_MGMT || | 638 | if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_MGMT || |
639 | WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_AUTH || | 639 | WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_AUTH || |
@@ -692,7 +692,7 @@ static void hostap_ap_tx_cb_assoc(struct sk_buff *skb, int ok, void *data) | |||
692 | { | 692 | { |
693 | struct ap_data *ap = data; | 693 | struct ap_data *ap = data; |
694 | struct net_device *dev = ap->local->dev; | 694 | struct net_device *dev = ap->local->dev; |
695 | struct ieee80211_hdr *hdr; | 695 | struct ieee80211_hdr_4addr *hdr; |
696 | u16 fc, *pos, status; | 696 | u16 fc, *pos, status; |
697 | struct sta_info *sta = NULL; | 697 | struct sta_info *sta = NULL; |
698 | char *txt = NULL; | 698 | char *txt = NULL; |
@@ -702,7 +702,7 @@ static void hostap_ap_tx_cb_assoc(struct sk_buff *skb, int ok, void *data) | |||
702 | return; | 702 | return; |
703 | } | 703 | } |
704 | 704 | ||
705 | hdr = (struct ieee80211_hdr *) skb->data; | 705 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
706 | fc = le16_to_cpu(hdr->frame_ctl); | 706 | fc = le16_to_cpu(hdr->frame_ctl); |
707 | if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_MGMT || | 707 | if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_MGMT || |
708 | (WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_ASSOC_RESP && | 708 | (WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_ASSOC_RESP && |
@@ -757,12 +757,12 @@ static void hostap_ap_tx_cb_assoc(struct sk_buff *skb, int ok, void *data) | |||
757 | static void hostap_ap_tx_cb_poll(struct sk_buff *skb, int ok, void *data) | 757 | static void hostap_ap_tx_cb_poll(struct sk_buff *skb, int ok, void *data) |
758 | { | 758 | { |
759 | struct ap_data *ap = data; | 759 | struct ap_data *ap = data; |
760 | struct ieee80211_hdr *hdr; | 760 | struct ieee80211_hdr_4addr *hdr; |
761 | struct sta_info *sta; | 761 | struct sta_info *sta; |
762 | 762 | ||
763 | if (skb->len < 24) | 763 | if (skb->len < 24) |
764 | goto fail; | 764 | goto fail; |
765 | hdr = (struct ieee80211_hdr *) skb->data; | 765 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
766 | if (ok) { | 766 | if (ok) { |
767 | spin_lock(&ap->sta_table_lock); | 767 | spin_lock(&ap->sta_table_lock); |
768 | sta = ap_get_sta(ap, hdr->addr1); | 768 | sta = ap_get_sta(ap, hdr->addr1); |
@@ -918,7 +918,7 @@ static void prism2_send_mgmt(struct net_device *dev, | |||
918 | { | 918 | { |
919 | struct hostap_interface *iface; | 919 | struct hostap_interface *iface; |
920 | local_info_t *local; | 920 | local_info_t *local; |
921 | struct ieee80211_hdr *hdr; | 921 | struct ieee80211_hdr_4addr *hdr; |
922 | u16 fc; | 922 | u16 fc; |
923 | struct sk_buff *skb; | 923 | struct sk_buff *skb; |
924 | struct hostap_skb_tx_data *meta; | 924 | struct hostap_skb_tx_data *meta; |
@@ -944,7 +944,7 @@ static void prism2_send_mgmt(struct net_device *dev, | |||
944 | 944 | ||
945 | fc = type_subtype; | 945 | fc = type_subtype; |
946 | hdrlen = hostap_80211_get_hdrlen(fc); | 946 | hdrlen = hostap_80211_get_hdrlen(fc); |
947 | hdr = (struct ieee80211_hdr *) skb_put(skb, hdrlen); | 947 | hdr = (struct ieee80211_hdr_4addr *) skb_put(skb, hdrlen); |
948 | if (body) | 948 | if (body) |
949 | memcpy(skb_put(skb, body_len), body, body_len); | 949 | memcpy(skb_put(skb, body_len), body, body_len); |
950 | 950 | ||
@@ -1256,14 +1256,14 @@ static char * ap_auth_make_challenge(struct ap_data *ap) | |||
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | skb = dev_alloc_skb(WLAN_AUTH_CHALLENGE_LEN + | 1258 | skb = dev_alloc_skb(WLAN_AUTH_CHALLENGE_LEN + |
1259 | ap->crypt->extra_prefix_len + | 1259 | ap->crypt->extra_mpdu_prefix_len + |
1260 | ap->crypt->extra_postfix_len); | 1260 | ap->crypt->extra_mpdu_postfix_len); |
1261 | if (skb == NULL) { | 1261 | if (skb == NULL) { |
1262 | kfree(tmpbuf); | 1262 | kfree(tmpbuf); |
1263 | return NULL; | 1263 | return NULL; |
1264 | } | 1264 | } |
1265 | 1265 | ||
1266 | skb_reserve(skb, ap->crypt->extra_prefix_len); | 1266 | skb_reserve(skb, ap->crypt->extra_mpdu_prefix_len); |
1267 | memset(skb_put(skb, WLAN_AUTH_CHALLENGE_LEN), 0, | 1267 | memset(skb_put(skb, WLAN_AUTH_CHALLENGE_LEN), 0, |
1268 | WLAN_AUTH_CHALLENGE_LEN); | 1268 | WLAN_AUTH_CHALLENGE_LEN); |
1269 | if (ap->crypt->encrypt_mpdu(skb, 0, ap->crypt_priv)) { | 1269 | if (ap->crypt->encrypt_mpdu(skb, 0, ap->crypt_priv)) { |
@@ -1272,7 +1272,7 @@ static char * ap_auth_make_challenge(struct ap_data *ap) | |||
1272 | return NULL; | 1272 | return NULL; |
1273 | } | 1273 | } |
1274 | 1274 | ||
1275 | memcpy(tmpbuf, skb->data + ap->crypt->extra_prefix_len, | 1275 | memcpy(tmpbuf, skb->data + ap->crypt->extra_mpdu_prefix_len, |
1276 | WLAN_AUTH_CHALLENGE_LEN); | 1276 | WLAN_AUTH_CHALLENGE_LEN); |
1277 | dev_kfree_skb(skb); | 1277 | dev_kfree_skb(skb); |
1278 | 1278 | ||
@@ -1285,7 +1285,7 @@ static void handle_authen(local_info_t *local, struct sk_buff *skb, | |||
1285 | struct hostap_80211_rx_status *rx_stats) | 1285 | struct hostap_80211_rx_status *rx_stats) |
1286 | { | 1286 | { |
1287 | struct net_device *dev = local->dev; | 1287 | struct net_device *dev = local->dev; |
1288 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1288 | struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data; |
1289 | size_t hdrlen; | 1289 | size_t hdrlen; |
1290 | struct ap_data *ap = local->ap; | 1290 | struct ap_data *ap = local->ap; |
1291 | char body[8 + WLAN_AUTH_CHALLENGE_LEN], *challenge = NULL; | 1291 | char body[8 + WLAN_AUTH_CHALLENGE_LEN], *challenge = NULL; |
@@ -1498,7 +1498,7 @@ static void handle_assoc(local_info_t *local, struct sk_buff *skb, | |||
1498 | struct hostap_80211_rx_status *rx_stats, int reassoc) | 1498 | struct hostap_80211_rx_status *rx_stats, int reassoc) |
1499 | { | 1499 | { |
1500 | struct net_device *dev = local->dev; | 1500 | struct net_device *dev = local->dev; |
1501 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1501 | struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data; |
1502 | char body[12], *p, *lpos; | 1502 | char body[12], *p, *lpos; |
1503 | int len, left; | 1503 | int len, left; |
1504 | u16 *pos; | 1504 | u16 *pos; |
@@ -1705,7 +1705,7 @@ static void handle_deauth(local_info_t *local, struct sk_buff *skb, | |||
1705 | struct hostap_80211_rx_status *rx_stats) | 1705 | struct hostap_80211_rx_status *rx_stats) |
1706 | { | 1706 | { |
1707 | struct net_device *dev = local->dev; | 1707 | struct net_device *dev = local->dev; |
1708 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1708 | struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data; |
1709 | char *body = (char *) (skb->data + IEEE80211_MGMT_HDR_LEN); | 1709 | char *body = (char *) (skb->data + IEEE80211_MGMT_HDR_LEN); |
1710 | int len; | 1710 | int len; |
1711 | u16 reason_code, *pos; | 1711 | u16 reason_code, *pos; |
@@ -1746,7 +1746,7 @@ static void handle_disassoc(local_info_t *local, struct sk_buff *skb, | |||
1746 | struct hostap_80211_rx_status *rx_stats) | 1746 | struct hostap_80211_rx_status *rx_stats) |
1747 | { | 1747 | { |
1748 | struct net_device *dev = local->dev; | 1748 | struct net_device *dev = local->dev; |
1749 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1749 | struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data; |
1750 | char *body = skb->data + IEEE80211_MGMT_HDR_LEN; | 1750 | char *body = skb->data + IEEE80211_MGMT_HDR_LEN; |
1751 | int len; | 1751 | int len; |
1752 | u16 reason_code, *pos; | 1752 | u16 reason_code, *pos; |
@@ -1784,7 +1784,7 @@ static void handle_disassoc(local_info_t *local, struct sk_buff *skb, | |||
1784 | 1784 | ||
1785 | /* Called only as a scheduled task for pending AP frames. */ | 1785 | /* Called only as a scheduled task for pending AP frames. */ |
1786 | static void ap_handle_data_nullfunc(local_info_t *local, | 1786 | static void ap_handle_data_nullfunc(local_info_t *local, |
1787 | struct ieee80211_hdr *hdr) | 1787 | struct ieee80211_hdr_4addr *hdr) |
1788 | { | 1788 | { |
1789 | struct net_device *dev = local->dev; | 1789 | struct net_device *dev = local->dev; |
1790 | 1790 | ||
@@ -1801,7 +1801,7 @@ static void ap_handle_data_nullfunc(local_info_t *local, | |||
1801 | 1801 | ||
1802 | /* Called only as a scheduled task for pending AP frames. */ | 1802 | /* Called only as a scheduled task for pending AP frames. */ |
1803 | static void ap_handle_dropped_data(local_info_t *local, | 1803 | static void ap_handle_dropped_data(local_info_t *local, |
1804 | struct ieee80211_hdr *hdr) | 1804 | struct ieee80211_hdr_4addr *hdr) |
1805 | { | 1805 | { |
1806 | struct net_device *dev = local->dev; | 1806 | struct net_device *dev = local->dev; |
1807 | struct sta_info *sta; | 1807 | struct sta_info *sta; |
@@ -1860,7 +1860,7 @@ static void pspoll_send_buffered(local_info_t *local, struct sta_info *sta, | |||
1860 | 1860 | ||
1861 | /* Called only as a scheduled task for pending AP frames. */ | 1861 | /* Called only as a scheduled task for pending AP frames. */ |
1862 | static void handle_pspoll(local_info_t *local, | 1862 | static void handle_pspoll(local_info_t *local, |
1863 | struct ieee80211_hdr *hdr, | 1863 | struct ieee80211_hdr_4addr *hdr, |
1864 | struct hostap_80211_rx_status *rx_stats) | 1864 | struct hostap_80211_rx_status *rx_stats) |
1865 | { | 1865 | { |
1866 | struct net_device *dev = local->dev; | 1866 | struct net_device *dev = local->dev; |
@@ -1979,7 +1979,7 @@ static void handle_wds_oper_queue(void *data) | |||
1979 | static void handle_beacon(local_info_t *local, struct sk_buff *skb, | 1979 | static void handle_beacon(local_info_t *local, struct sk_buff *skb, |
1980 | struct hostap_80211_rx_status *rx_stats) | 1980 | struct hostap_80211_rx_status *rx_stats) |
1981 | { | 1981 | { |
1982 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1982 | struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data; |
1983 | char *body = skb->data + IEEE80211_MGMT_HDR_LEN; | 1983 | char *body = skb->data + IEEE80211_MGMT_HDR_LEN; |
1984 | int len, left; | 1984 | int len, left; |
1985 | u16 *pos, beacon_int, capability; | 1985 | u16 *pos, beacon_int, capability; |
@@ -2137,11 +2137,11 @@ static void handle_ap_item(local_info_t *local, struct sk_buff *skb, | |||
2137 | struct net_device *dev = local->dev; | 2137 | struct net_device *dev = local->dev; |
2138 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ | 2138 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ |
2139 | u16 fc, type, stype; | 2139 | u16 fc, type, stype; |
2140 | struct ieee80211_hdr *hdr; | 2140 | struct ieee80211_hdr_4addr *hdr; |
2141 | 2141 | ||
2142 | /* FIX: should give skb->len to handler functions and check that the | 2142 | /* FIX: should give skb->len to handler functions and check that the |
2143 | * buffer is long enough */ | 2143 | * buffer is long enough */ |
2144 | hdr = (struct ieee80211_hdr *) skb->data; | 2144 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
2145 | fc = le16_to_cpu(hdr->frame_ctl); | 2145 | fc = le16_to_cpu(hdr->frame_ctl); |
2146 | type = WLAN_FC_GET_TYPE(fc); | 2146 | type = WLAN_FC_GET_TYPE(fc); |
2147 | stype = WLAN_FC_GET_STYPE(fc); | 2147 | stype = WLAN_FC_GET_STYPE(fc); |
@@ -2258,7 +2258,7 @@ void hostap_rx(struct net_device *dev, struct sk_buff *skb, | |||
2258 | struct hostap_interface *iface; | 2258 | struct hostap_interface *iface; |
2259 | local_info_t *local; | 2259 | local_info_t *local; |
2260 | u16 fc; | 2260 | u16 fc; |
2261 | struct ieee80211_hdr *hdr; | 2261 | struct ieee80211_hdr_4addr *hdr; |
2262 | 2262 | ||
2263 | iface = netdev_priv(dev); | 2263 | iface = netdev_priv(dev); |
2264 | local = iface->local; | 2264 | local = iface->local; |
@@ -2268,7 +2268,7 @@ void hostap_rx(struct net_device *dev, struct sk_buff *skb, | |||
2268 | 2268 | ||
2269 | local->stats.rx_packets++; | 2269 | local->stats.rx_packets++; |
2270 | 2270 | ||
2271 | hdr = (struct ieee80211_hdr *) skb->data; | 2271 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
2272 | fc = le16_to_cpu(hdr->frame_ctl); | 2272 | fc = le16_to_cpu(hdr->frame_ctl); |
2273 | 2273 | ||
2274 | if (local->ap->ap_policy == AP_OTHER_AP_SKIP_ALL && | 2274 | if (local->ap->ap_policy == AP_OTHER_AP_SKIP_ALL && |
@@ -2289,7 +2289,7 @@ void hostap_rx(struct net_device *dev, struct sk_buff *skb, | |||
2289 | static void schedule_packet_send(local_info_t *local, struct sta_info *sta) | 2289 | static void schedule_packet_send(local_info_t *local, struct sta_info *sta) |
2290 | { | 2290 | { |
2291 | struct sk_buff *skb; | 2291 | struct sk_buff *skb; |
2292 | struct ieee80211_hdr *hdr; | 2292 | struct ieee80211_hdr_4addr *hdr; |
2293 | struct hostap_80211_rx_status rx_stats; | 2293 | struct hostap_80211_rx_status rx_stats; |
2294 | 2294 | ||
2295 | if (skb_queue_empty(&sta->tx_buf)) | 2295 | if (skb_queue_empty(&sta->tx_buf)) |
@@ -2302,7 +2302,7 @@ static void schedule_packet_send(local_info_t *local, struct sta_info *sta) | |||
2302 | return; | 2302 | return; |
2303 | } | 2303 | } |
2304 | 2304 | ||
2305 | hdr = (struct ieee80211_hdr *) skb_put(skb, 16); | 2305 | hdr = (struct ieee80211_hdr_4addr *) skb_put(skb, 16); |
2306 | 2306 | ||
2307 | /* Generate a fake pspoll frame to start packet delivery */ | 2307 | /* Generate a fake pspoll frame to start packet delivery */ |
2308 | hdr->frame_ctl = __constant_cpu_to_le16( | 2308 | hdr->frame_ctl = __constant_cpu_to_le16( |
@@ -2349,7 +2349,7 @@ static int prism2_ap_get_sta_qual(local_info_t *local, struct sockaddr addr[], | |||
2349 | qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence); | 2349 | qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence); |
2350 | qual[count].updated = sta->last_rx_updated; | 2350 | qual[count].updated = sta->last_rx_updated; |
2351 | 2351 | ||
2352 | sta->last_rx_updated = 0; | 2352 | sta->last_rx_updated = IW_QUAL_DBM; |
2353 | 2353 | ||
2354 | count++; | 2354 | count++; |
2355 | if (count >= buf_size) | 2355 | if (count >= buf_size) |
@@ -2467,7 +2467,7 @@ static int prism2_ap_translate_scan(struct net_device *dev, char *buffer) | |||
2467 | } | 2467 | } |
2468 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ | 2468 | #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ |
2469 | 2469 | ||
2470 | sta->last_rx_updated = 0; | 2470 | sta->last_rx_updated = IW_QUAL_DBM; |
2471 | 2471 | ||
2472 | /* To be continued, we should make good use of IWEVCUSTOM */ | 2472 | /* To be continued, we should make good use of IWEVCUSTOM */ |
2473 | } | 2473 | } |
@@ -2685,7 +2685,7 @@ ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx) | |||
2685 | struct sta_info *sta = NULL; | 2685 | struct sta_info *sta = NULL; |
2686 | struct sk_buff *skb = tx->skb; | 2686 | struct sk_buff *skb = tx->skb; |
2687 | int set_tim, ret; | 2687 | int set_tim, ret; |
2688 | struct ieee80211_hdr *hdr; | 2688 | struct ieee80211_hdr_4addr *hdr; |
2689 | struct hostap_skb_tx_data *meta; | 2689 | struct hostap_skb_tx_data *meta; |
2690 | 2690 | ||
2691 | meta = (struct hostap_skb_tx_data *) skb->cb; | 2691 | meta = (struct hostap_skb_tx_data *) skb->cb; |
@@ -2694,7 +2694,7 @@ ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx) | |||
2694 | meta->iface->type == HOSTAP_INTERFACE_STA) | 2694 | meta->iface->type == HOSTAP_INTERFACE_STA) |
2695 | goto out; | 2695 | goto out; |
2696 | 2696 | ||
2697 | hdr = (struct ieee80211_hdr *) skb->data; | 2697 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
2698 | 2698 | ||
2699 | if (hdr->addr1[0] & 0x01) { | 2699 | if (hdr->addr1[0] & 0x01) { |
2700 | /* broadcast/multicast frame - no AP related processing */ | 2700 | /* broadcast/multicast frame - no AP related processing */ |
@@ -2821,10 +2821,10 @@ void hostap_handle_sta_release(void *ptr) | |||
2821 | void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb) | 2821 | void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb) |
2822 | { | 2822 | { |
2823 | struct sta_info *sta; | 2823 | struct sta_info *sta; |
2824 | struct ieee80211_hdr *hdr; | 2824 | struct ieee80211_hdr_4addr *hdr; |
2825 | struct hostap_skb_tx_data *meta; | 2825 | struct hostap_skb_tx_data *meta; |
2826 | 2826 | ||
2827 | hdr = (struct ieee80211_hdr *) skb->data; | 2827 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
2828 | meta = (struct hostap_skb_tx_data *) skb->cb; | 2828 | meta = (struct hostap_skb_tx_data *) skb->cb; |
2829 | 2829 | ||
2830 | spin_lock(&local->ap->sta_table_lock); | 2830 | spin_lock(&local->ap->sta_table_lock); |
@@ -2892,7 +2892,7 @@ static void hostap_update_sta_ps2(local_info_t *local, struct sta_info *sta, | |||
2892 | 2892 | ||
2893 | /* Called only as a tasklet (software IRQ). Called for each RX frame to update | 2893 | /* Called only as a tasklet (software IRQ). Called for each RX frame to update |
2894 | * STA power saving state. pwrmgt is a flag from 802.11 frame_ctl field. */ | 2894 | * STA power saving state. pwrmgt is a flag from 802.11 frame_ctl field. */ |
2895 | int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr *hdr) | 2895 | int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr_4addr *hdr) |
2896 | { | 2896 | { |
2897 | struct sta_info *sta; | 2897 | struct sta_info *sta; |
2898 | u16 fc; | 2898 | u16 fc; |
@@ -2925,12 +2925,12 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev, | |||
2925 | int ret; | 2925 | int ret; |
2926 | struct sta_info *sta; | 2926 | struct sta_info *sta; |
2927 | u16 fc, type, stype; | 2927 | u16 fc, type, stype; |
2928 | struct ieee80211_hdr *hdr; | 2928 | struct ieee80211_hdr_4addr *hdr; |
2929 | 2929 | ||
2930 | if (local->ap == NULL) | 2930 | if (local->ap == NULL) |
2931 | return AP_RX_CONTINUE; | 2931 | return AP_RX_CONTINUE; |
2932 | 2932 | ||
2933 | hdr = (struct ieee80211_hdr *) skb->data; | 2933 | hdr = (struct ieee80211_hdr_4addr *) skb->data; |
2934 | 2934 | ||
2935 | fc = le16_to_cpu(hdr->frame_ctl); | 2935 | fc = le16_to_cpu(hdr->frame_ctl); |
2936 | type = WLAN_FC_GET_TYPE(fc); | 2936 | type = WLAN_FC_GET_TYPE(fc); |
@@ -3058,7 +3058,7 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev, | |||
3058 | 3058 | ||
3059 | /* Called only as a tasklet (software IRQ) */ | 3059 | /* Called only as a tasklet (software IRQ) */ |
3060 | int hostap_handle_sta_crypto(local_info_t *local, | 3060 | int hostap_handle_sta_crypto(local_info_t *local, |
3061 | struct ieee80211_hdr *hdr, | 3061 | struct ieee80211_hdr_4addr *hdr, |
3062 | struct ieee80211_crypt_data **crypt, | 3062 | struct ieee80211_crypt_data **crypt, |
3063 | void **sta_ptr) | 3063 | void **sta_ptr) |
3064 | { | 3064 | { |
@@ -3160,7 +3160,7 @@ int hostap_add_sta(struct ap_data *ap, u8 *sta_addr) | |||
3160 | 3160 | ||
3161 | /* Called only as a tasklet (software IRQ) */ | 3161 | /* Called only as a tasklet (software IRQ) */ |
3162 | int hostap_update_rx_stats(struct ap_data *ap, | 3162 | int hostap_update_rx_stats(struct ap_data *ap, |
3163 | struct ieee80211_hdr *hdr, | 3163 | struct ieee80211_hdr_4addr *hdr, |
3164 | struct hostap_80211_rx_status *rx_stats) | 3164 | struct hostap_80211_rx_status *rx_stats) |
3165 | { | 3165 | { |
3166 | struct sta_info *sta; | 3166 | struct sta_info *sta; |
@@ -3174,7 +3174,7 @@ int hostap_update_rx_stats(struct ap_data *ap, | |||
3174 | sta->last_rx_silence = rx_stats->noise; | 3174 | sta->last_rx_silence = rx_stats->noise; |
3175 | sta->last_rx_signal = rx_stats->signal; | 3175 | sta->last_rx_signal = rx_stats->signal; |
3176 | sta->last_rx_rate = rx_stats->rate; | 3176 | sta->last_rx_rate = rx_stats->rate; |
3177 | sta->last_rx_updated = 7; | 3177 | sta->last_rx_updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; |
3178 | if (rx_stats->rate == 10) | 3178 | if (rx_stats->rate == 10) |
3179 | sta->rx_count[0]++; | 3179 | sta->rx_count[0]++; |
3180 | else if (rx_stats->rate == 20) | 3180 | else if (rx_stats->rate == 20) |
diff --git a/drivers/net/wireless/hostap/hostap_ap.h b/drivers/net/wireless/hostap/hostap_ap.h index 816a52bcea8f..6d00df69c2e3 100644 --- a/drivers/net/wireless/hostap/hostap_ap.h +++ b/drivers/net/wireless/hostap/hostap_ap.h | |||
@@ -233,7 +233,7 @@ struct hostap_tx_data { | |||
233 | ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx); | 233 | ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx); |
234 | void hostap_handle_sta_release(void *ptr); | 234 | void hostap_handle_sta_release(void *ptr); |
235 | void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb); | 235 | void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb); |
236 | int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr *hdr); | 236 | int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr_4addr *hdr); |
237 | typedef enum { | 237 | typedef enum { |
238 | AP_RX_CONTINUE, AP_RX_DROP, AP_RX_EXIT, AP_RX_CONTINUE_NOT_AUTHORIZED | 238 | AP_RX_CONTINUE, AP_RX_DROP, AP_RX_EXIT, AP_RX_CONTINUE_NOT_AUTHORIZED |
239 | } ap_rx_ret; | 239 | } ap_rx_ret; |
@@ -241,13 +241,13 @@ ap_rx_ret hostap_handle_sta_rx(local_info_t *local, struct net_device *dev, | |||
241 | struct sk_buff *skb, | 241 | struct sk_buff *skb, |
242 | struct hostap_80211_rx_status *rx_stats, | 242 | struct hostap_80211_rx_status *rx_stats, |
243 | int wds); | 243 | int wds); |
244 | int hostap_handle_sta_crypto(local_info_t *local, struct ieee80211_hdr *hdr, | 244 | int hostap_handle_sta_crypto(local_info_t *local, struct ieee80211_hdr_4addr *hdr, |
245 | struct ieee80211_crypt_data **crypt, | 245 | struct ieee80211_crypt_data **crypt, |
246 | void **sta_ptr); | 246 | void **sta_ptr); |
247 | int hostap_is_sta_assoc(struct ap_data *ap, u8 *sta_addr); | 247 | int hostap_is_sta_assoc(struct ap_data *ap, u8 *sta_addr); |
248 | int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr); | 248 | int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr); |
249 | int hostap_add_sta(struct ap_data *ap, u8 *sta_addr); | 249 | int hostap_add_sta(struct ap_data *ap, u8 *sta_addr); |
250 | int hostap_update_rx_stats(struct ap_data *ap, struct ieee80211_hdr *hdr, | 250 | int hostap_update_rx_stats(struct ap_data *ap, struct ieee80211_hdr_4addr *hdr, |
251 | struct hostap_80211_rx_status *rx_stats); | 251 | struct hostap_80211_rx_status *rx_stats); |
252 | void hostap_update_rates(local_info_t *local); | 252 | void hostap_update_rates(local_info_t *local); |
253 | void hostap_add_wds_links(local_info_t *local); | 253 | void hostap_add_wds_links(local_info_t *local); |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index faa83badf0a1..2643976a6677 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -492,42 +492,10 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) | |||
492 | } | 492 | } |
493 | 493 | ||
494 | 494 | ||
495 | static int prism2_pccard_dev_open(local_info_t *local) | ||
496 | { | ||
497 | struct hostap_cs_priv *hw_priv = local->hw_priv; | ||
498 | hw_priv->link->open++; | ||
499 | return 0; | ||
500 | } | ||
501 | |||
502 | |||
503 | static int prism2_pccard_dev_close(local_info_t *local) | ||
504 | { | ||
505 | struct hostap_cs_priv *hw_priv; | ||
506 | |||
507 | if (local == NULL || local->hw_priv == NULL) | ||
508 | return 1; | ||
509 | hw_priv = local->hw_priv; | ||
510 | if (hw_priv->link == NULL) | ||
511 | return 1; | ||
512 | |||
513 | if (!hw_priv->link->open) { | ||
514 | printk(KERN_WARNING "%s: prism2_pccard_dev_close(): " | ||
515 | "link not open?!\n", local->dev->name); | ||
516 | return 1; | ||
517 | } | ||
518 | |||
519 | hw_priv->link->open--; | ||
520 | |||
521 | return 0; | ||
522 | } | ||
523 | |||
524 | |||
525 | static struct prism2_helper_functions prism2_pccard_funcs = | 495 | static struct prism2_helper_functions prism2_pccard_funcs = |
526 | { | 496 | { |
527 | .card_present = prism2_pccard_card_present, | 497 | .card_present = prism2_pccard_card_present, |
528 | .cor_sreset = prism2_pccard_cor_sreset, | 498 | .cor_sreset = prism2_pccard_cor_sreset, |
529 | .dev_open = prism2_pccard_dev_open, | ||
530 | .dev_close = prism2_pccard_dev_close, | ||
531 | .genesis_reset = prism2_pccard_genesis_reset, | 499 | .genesis_reset = prism2_pccard_genesis_reset, |
532 | .hw_type = HOSTAP_HW_PCCARD, | 500 | .hw_type = HOSTAP_HW_PCCARD, |
533 | }; | 501 | }; |
@@ -597,13 +565,14 @@ static void prism2_detach(dev_link_t *link) | |||
597 | *linkp = link->next; | 565 | *linkp = link->next; |
598 | /* release net devices */ | 566 | /* release net devices */ |
599 | if (link->priv) { | 567 | if (link->priv) { |
568 | struct hostap_cs_priv *hw_priv; | ||
600 | struct net_device *dev; | 569 | struct net_device *dev; |
601 | struct hostap_interface *iface; | 570 | struct hostap_interface *iface; |
602 | dev = link->priv; | 571 | dev = link->priv; |
603 | iface = netdev_priv(dev); | 572 | iface = netdev_priv(dev); |
604 | kfree(iface->local->hw_priv); | 573 | hw_priv = iface->local->hw_priv; |
605 | iface->local->hw_priv = NULL; | ||
606 | prism2_free_local_data(dev); | 574 | prism2_free_local_data(dev); |
575 | kfree(hw_priv); | ||
607 | } | 576 | } |
608 | kfree(link); | 577 | kfree(link); |
609 | } | 578 | } |
@@ -883,6 +852,13 @@ static int prism2_event(event_t event, int priority, | |||
883 | { | 852 | { |
884 | dev_link_t *link = args->client_data; | 853 | dev_link_t *link = args->client_data; |
885 | struct net_device *dev = (struct net_device *) link->priv; | 854 | struct net_device *dev = (struct net_device *) link->priv; |
855 | int dev_open = 0; | ||
856 | |||
857 | if (link->state & DEV_CONFIG) { | ||
858 | struct hostap_interface *iface = netdev_priv(dev); | ||
859 | if (iface && iface->local) | ||
860 | dev_open = iface->local->num_dev_open > 0; | ||
861 | } | ||
886 | 862 | ||
887 | switch (event) { | 863 | switch (event) { |
888 | case CS_EVENT_CARD_INSERTION: | 864 | case CS_EVENT_CARD_INSERTION: |
@@ -911,7 +887,7 @@ static int prism2_event(event_t event, int priority, | |||
911 | case CS_EVENT_RESET_PHYSICAL: | 887 | case CS_EVENT_RESET_PHYSICAL: |
912 | PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_RESET_PHYSICAL\n", dev_info); | 888 | PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_RESET_PHYSICAL\n", dev_info); |
913 | if (link->state & DEV_CONFIG) { | 889 | if (link->state & DEV_CONFIG) { |
914 | if (link->open) { | 890 | if (dev_open) { |
915 | netif_stop_queue(dev); | 891 | netif_stop_queue(dev); |
916 | netif_device_detach(dev); | 892 | netif_device_detach(dev); |
917 | } | 893 | } |
@@ -931,8 +907,8 @@ static int prism2_event(event_t event, int priority, | |||
931 | pcmcia_request_configuration(link->handle, | 907 | pcmcia_request_configuration(link->handle, |
932 | &link->conf); | 908 | &link->conf); |
933 | prism2_hw_shutdown(dev, 1); | 909 | prism2_hw_shutdown(dev, 1); |
934 | prism2_hw_config(dev, link->open ? 0 : 1); | 910 | prism2_hw_config(dev, dev_open ? 0 : 1); |
935 | if (link->open) { | 911 | if (dev_open) { |
936 | netif_device_attach(dev); | 912 | netif_device_attach(dev); |
937 | netif_start_queue(dev); | 913 | netif_start_queue(dev); |
938 | } | 914 | } |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index e533a663deda..59fc15572395 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
@@ -3322,6 +3322,18 @@ static void prism2_free_local_data(struct net_device *dev) | |||
3322 | iface = netdev_priv(dev); | 3322 | iface = netdev_priv(dev); |
3323 | local = iface->local; | 3323 | local = iface->local; |
3324 | 3324 | ||
3325 | /* Unregister all netdevs before freeing local data. */ | ||
3326 | list_for_each_safe(ptr, n, &local->hostap_interfaces) { | ||
3327 | iface = list_entry(ptr, struct hostap_interface, list); | ||
3328 | if (iface->type == HOSTAP_INTERFACE_MASTER) { | ||
3329 | /* special handling for this interface below */ | ||
3330 | continue; | ||
3331 | } | ||
3332 | hostap_remove_interface(iface->dev, 0, 1); | ||
3333 | } | ||
3334 | |||
3335 | unregister_netdev(local->dev); | ||
3336 | |||
3325 | flush_scheduled_work(); | 3337 | flush_scheduled_work(); |
3326 | 3338 | ||
3327 | if (timer_pending(&local->crypt_deinit_timer)) | 3339 | if (timer_pending(&local->crypt_deinit_timer)) |
@@ -3382,15 +3394,6 @@ static void prism2_free_local_data(struct net_device *dev) | |||
3382 | prism2_download_free_data(local->dl_sec); | 3394 | prism2_download_free_data(local->dl_sec); |
3383 | #endif /* PRISM2_DOWNLOAD_SUPPORT */ | 3395 | #endif /* PRISM2_DOWNLOAD_SUPPORT */ |
3384 | 3396 | ||
3385 | list_for_each_safe(ptr, n, &local->hostap_interfaces) { | ||
3386 | iface = list_entry(ptr, struct hostap_interface, list); | ||
3387 | if (iface->type == HOSTAP_INTERFACE_MASTER) { | ||
3388 | /* special handling for this interface below */ | ||
3389 | continue; | ||
3390 | } | ||
3391 | hostap_remove_interface(iface->dev, 0, 1); | ||
3392 | } | ||
3393 | |||
3394 | prism2_clear_set_tim_queue(local); | 3397 | prism2_clear_set_tim_queue(local); |
3395 | 3398 | ||
3396 | list_for_each_safe(ptr, n, &local->bss_list) { | 3399 | list_for_each_safe(ptr, n, &local->bss_list) { |
@@ -3403,7 +3406,6 @@ static void prism2_free_local_data(struct net_device *dev) | |||
3403 | kfree(local->last_scan_results); | 3406 | kfree(local->last_scan_results); |
3404 | kfree(local->generic_elem); | 3407 | kfree(local->generic_elem); |
3405 | 3408 | ||
3406 | unregister_netdev(local->dev); | ||
3407 | free_netdev(local->dev); | 3409 | free_netdev(local->dev); |
3408 | } | 3410 | } |
3409 | 3411 | ||
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c index e720369a3515..53f5246c40aa 100644 --- a/drivers/net/wireless/hostap/hostap_ioctl.c +++ b/drivers/net/wireless/hostap/hostap_ioctl.c | |||
@@ -50,7 +50,8 @@ static struct iw_statistics *hostap_get_wireless_stats(struct net_device *dev) | |||
50 | #endif /* in_atomic */ | 50 | #endif /* in_atomic */ |
51 | 51 | ||
52 | if (update && prism2_update_comms_qual(dev) == 0) | 52 | if (update && prism2_update_comms_qual(dev) == 0) |
53 | wstats->qual.updated = 7; | 53 | wstats->qual.updated = IW_QUAL_ALL_UPDATED | |
54 | IW_QUAL_DBM; | ||
54 | 55 | ||
55 | wstats->qual.qual = local->comms_qual; | 56 | wstats->qual.qual = local->comms_qual; |
56 | wstats->qual.level = local->avg_signal; | 57 | wstats->qual.level = local->avg_signal; |
@@ -59,7 +60,7 @@ static struct iw_statistics *hostap_get_wireless_stats(struct net_device *dev) | |||
59 | wstats->qual.qual = 0; | 60 | wstats->qual.qual = 0; |
60 | wstats->qual.level = 0; | 61 | wstats->qual.level = 0; |
61 | wstats->qual.noise = 0; | 62 | wstats->qual.noise = 0; |
62 | wstats->qual.updated = 0; | 63 | wstats->qual.updated = IW_QUAL_ALL_INVALID; |
63 | } | 64 | } |
64 | 65 | ||
65 | return wstats; | 66 | return wstats; |
@@ -1827,13 +1828,6 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1827 | iwe.cmd = SIOCGIWAP; | 1828 | iwe.cmd = SIOCGIWAP; |
1828 | iwe.u.ap_addr.sa_family = ARPHRD_ETHER; | 1829 | iwe.u.ap_addr.sa_family = ARPHRD_ETHER; |
1829 | memcpy(iwe.u.ap_addr.sa_data, bssid, ETH_ALEN); | 1830 | memcpy(iwe.u.ap_addr.sa_data, bssid, ETH_ALEN); |
1830 | /* FIX: | ||
1831 | * I do not know how this is possible, but iwe_stream_add_event | ||
1832 | * seems to re-order memcpy execution so that len is set only | ||
1833 | * after copying.. Pre-setting len here "fixes" this, but real | ||
1834 | * problems should be solved (after which these iwe.len | ||
1835 | * settings could be removed from this function). */ | ||
1836 | iwe.len = IW_EV_ADDR_LEN; | ||
1837 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 1831 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
1838 | IW_EV_ADDR_LEN); | 1832 | IW_EV_ADDR_LEN); |
1839 | 1833 | ||
@@ -1843,7 +1837,6 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1843 | iwe.cmd = SIOCGIWESSID; | 1837 | iwe.cmd = SIOCGIWESSID; |
1844 | iwe.u.data.length = ssid_len; | 1838 | iwe.u.data.length = ssid_len; |
1845 | iwe.u.data.flags = 1; | 1839 | iwe.u.data.flags = 1; |
1846 | iwe.len = IW_EV_POINT_LEN + iwe.u.data.length; | ||
1847 | current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ssid); | 1840 | current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ssid); |
1848 | 1841 | ||
1849 | memset(&iwe, 0, sizeof(iwe)); | 1842 | memset(&iwe, 0, sizeof(iwe)); |
@@ -1859,7 +1852,6 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1859 | iwe.u.mode = IW_MODE_MASTER; | 1852 | iwe.u.mode = IW_MODE_MASTER; |
1860 | else | 1853 | else |
1861 | iwe.u.mode = IW_MODE_ADHOC; | 1854 | iwe.u.mode = IW_MODE_ADHOC; |
1862 | iwe.len = IW_EV_UINT_LEN; | ||
1863 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 1855 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
1864 | IW_EV_UINT_LEN); | 1856 | IW_EV_UINT_LEN); |
1865 | } | 1857 | } |
@@ -1877,7 +1869,6 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1877 | if (chan > 0) { | 1869 | if (chan > 0) { |
1878 | iwe.u.freq.m = freq_list[le16_to_cpu(chan - 1)] * 100000; | 1870 | iwe.u.freq.m = freq_list[le16_to_cpu(chan - 1)] * 100000; |
1879 | iwe.u.freq.e = 1; | 1871 | iwe.u.freq.e = 1; |
1880 | iwe.len = IW_EV_FREQ_LEN; | ||
1881 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 1872 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
1882 | IW_EV_FREQ_LEN); | 1873 | IW_EV_FREQ_LEN); |
1883 | } | 1874 | } |
@@ -1894,7 +1885,10 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1894 | iwe.u.qual.noise = | 1885 | iwe.u.qual.noise = |
1895 | HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->anl)); | 1886 | HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->anl)); |
1896 | } | 1887 | } |
1897 | iwe.len = IW_EV_QUAL_LEN; | 1888 | iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
1889 | | IW_QUAL_NOISE_UPDATED | ||
1890 | | IW_QUAL_QUAL_INVALID | ||
1891 | | IW_QUAL_DBM; | ||
1898 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, | 1892 | current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, |
1899 | IW_EV_QUAL_LEN); | 1893 | IW_EV_QUAL_LEN); |
1900 | } | 1894 | } |
@@ -1906,7 +1900,6 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1906 | else | 1900 | else |
1907 | iwe.u.data.flags = IW_ENCODE_DISABLED; | 1901 | iwe.u.data.flags = IW_ENCODE_DISABLED; |
1908 | iwe.u.data.length = 0; | 1902 | iwe.u.data.length = 0; |
1909 | iwe.len = IW_EV_POINT_LEN + iwe.u.data.length; | ||
1910 | current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ""); | 1903 | current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ""); |
1911 | 1904 | ||
1912 | /* TODO: add SuppRates into BSS table */ | 1905 | /* TODO: add SuppRates into BSS table */ |
@@ -1930,7 +1923,7 @@ static char * __prism2_translate_scan(local_info_t *local, | |||
1930 | } | 1923 | } |
1931 | 1924 | ||
1932 | /* TODO: add BeaconInt,resp_rate,atim into BSS table */ | 1925 | /* TODO: add BeaconInt,resp_rate,atim into BSS table */ |
1933 | buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_KERNEL); | 1926 | buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_ATOMIC); |
1934 | if (buf && scan) { | 1927 | if (buf && scan) { |
1935 | memset(&iwe, 0, sizeof(iwe)); | 1928 | memset(&iwe, 0, sizeof(iwe)); |
1936 | iwe.cmd = IWEVCUSTOM; | 1929 | iwe.cmd = IWEVCUSTOM; |
diff --git a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c index 025f8cdb5566..da0c80fb941c 100644 --- a/drivers/net/wireless/hostap/hostap_pci.c +++ b/drivers/net/wireless/hostap/hostap_pci.c | |||
@@ -59,11 +59,13 @@ static struct pci_device_id prism2_pci_id_table[] __devinitdata = { | |||
59 | static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) | 59 | static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) |
60 | { | 60 | { |
61 | struct hostap_interface *iface; | 61 | struct hostap_interface *iface; |
62 | struct hostap_pci_priv *hw_priv; | ||
62 | local_info_t *local; | 63 | local_info_t *local; |
63 | unsigned long flags; | 64 | unsigned long flags; |
64 | 65 | ||
65 | iface = netdev_priv(dev); | 66 | iface = netdev_priv(dev); |
66 | local = iface->local; | 67 | local = iface->local; |
68 | hw_priv = local->hw_priv; | ||
67 | 69 | ||
68 | spin_lock_irqsave(&local->lock, flags); | 70 | spin_lock_irqsave(&local->lock, flags); |
69 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); | 71 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v); |
@@ -74,12 +76,14 @@ static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v) | |||
74 | static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) | 76 | static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) |
75 | { | 77 | { |
76 | struct hostap_interface *iface; | 78 | struct hostap_interface *iface; |
79 | struct hostap_pci_priv *hw_priv; | ||
77 | local_info_t *local; | 80 | local_info_t *local; |
78 | unsigned long flags; | 81 | unsigned long flags; |
79 | u8 v; | 82 | u8 v; |
80 | 83 | ||
81 | iface = netdev_priv(dev); | 84 | iface = netdev_priv(dev); |
82 | local = iface->local; | 85 | local = iface->local; |
86 | hw_priv = local->hw_priv; | ||
83 | 87 | ||
84 | spin_lock_irqsave(&local->lock, flags); | 88 | spin_lock_irqsave(&local->lock, flags); |
85 | v = readb(hw_priv->mem_start + a); | 89 | v = readb(hw_priv->mem_start + a); |
@@ -91,11 +95,13 @@ static inline u8 hfa384x_inb_debug(struct net_device *dev, int a) | |||
91 | static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) | 95 | static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) |
92 | { | 96 | { |
93 | struct hostap_interface *iface; | 97 | struct hostap_interface *iface; |
98 | struct hostap_pci_priv *hw_priv; | ||
94 | local_info_t *local; | 99 | local_info_t *local; |
95 | unsigned long flags; | 100 | unsigned long flags; |
96 | 101 | ||
97 | iface = netdev_priv(dev); | 102 | iface = netdev_priv(dev); |
98 | local = iface->local; | 103 | local = iface->local; |
104 | hw_priv = local->hw_priv; | ||
99 | 105 | ||
100 | spin_lock_irqsave(&local->lock, flags); | 106 | spin_lock_irqsave(&local->lock, flags); |
101 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); | 107 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v); |
@@ -106,12 +112,14 @@ static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v) | |||
106 | static inline u16 hfa384x_inw_debug(struct net_device *dev, int a) | 112 | static inline u16 hfa384x_inw_debug(struct net_device *dev, int a) |
107 | { | 113 | { |
108 | struct hostap_interface *iface; | 114 | struct hostap_interface *iface; |
115 | struct hostap_pci_priv *hw_priv; | ||
109 | local_info_t *local; | 116 | local_info_t *local; |
110 | unsigned long flags; | 117 | unsigned long flags; |
111 | u16 v; | 118 | u16 v; |
112 | 119 | ||
113 | iface = netdev_priv(dev); | 120 | iface = netdev_priv(dev); |
114 | local = iface->local; | 121 | local = iface->local; |
122 | hw_priv = local->hw_priv; | ||
115 | 123 | ||
116 | spin_lock_irqsave(&local->lock, flags); | 124 | spin_lock_irqsave(&local->lock, flags); |
117 | v = readw(hw_priv->mem_start + a); | 125 | v = readw(hw_priv->mem_start + a); |
@@ -277,8 +285,6 @@ static struct prism2_helper_functions prism2_pci_funcs = | |||
277 | { | 285 | { |
278 | .card_present = NULL, | 286 | .card_present = NULL, |
279 | .cor_sreset = prism2_pci_cor_sreset, | 287 | .cor_sreset = prism2_pci_cor_sreset, |
280 | .dev_open = NULL, | ||
281 | .dev_close = NULL, | ||
282 | .genesis_reset = prism2_pci_genesis_reset, | 288 | .genesis_reset = prism2_pci_genesis_reset, |
283 | .hw_type = HOSTAP_HW_PCI, | 289 | .hw_type = HOSTAP_HW_PCI, |
284 | }; | 290 | }; |
@@ -352,8 +358,6 @@ static int prism2_pci_probe(struct pci_dev *pdev, | |||
352 | return hostap_hw_ready(dev); | 358 | return hostap_hw_ready(dev); |
353 | 359 | ||
354 | fail: | 360 | fail: |
355 | kfree(hw_priv); | ||
356 | |||
357 | if (irq_registered && dev) | 361 | if (irq_registered && dev) |
358 | free_irq(dev->irq, dev); | 362 | free_irq(dev->irq, dev); |
359 | 363 | ||
@@ -364,10 +368,8 @@ static int prism2_pci_probe(struct pci_dev *pdev, | |||
364 | 368 | ||
365 | err_out_disable: | 369 | err_out_disable: |
366 | pci_disable_device(pdev); | 370 | pci_disable_device(pdev); |
367 | kfree(hw_priv); | ||
368 | if (local) | ||
369 | local->hw_priv = NULL; | ||
370 | prism2_free_local_data(dev); | 371 | prism2_free_local_data(dev); |
372 | kfree(hw_priv); | ||
371 | 373 | ||
372 | return -ENODEV; | 374 | return -ENODEV; |
373 | } | 375 | } |
@@ -392,9 +394,8 @@ static void prism2_pci_remove(struct pci_dev *pdev) | |||
392 | free_irq(dev->irq, dev); | 394 | free_irq(dev->irq, dev); |
393 | 395 | ||
394 | mem_start = hw_priv->mem_start; | 396 | mem_start = hw_priv->mem_start; |
395 | kfree(hw_priv); | ||
396 | iface->local->hw_priv = NULL; | ||
397 | prism2_free_local_data(dev); | 397 | prism2_free_local_data(dev); |
398 | kfree(hw_priv); | ||
398 | 399 | ||
399 | iounmap(mem_start); | 400 | iounmap(mem_start); |
400 | 401 | ||
@@ -441,7 +442,7 @@ static int prism2_pci_resume(struct pci_dev *pdev) | |||
441 | MODULE_DEVICE_TABLE(pci, prism2_pci_id_table); | 442 | MODULE_DEVICE_TABLE(pci, prism2_pci_id_table); |
442 | 443 | ||
443 | static struct pci_driver prism2_pci_drv_id = { | 444 | static struct pci_driver prism2_pci_drv_id = { |
444 | .name = "prism2_pci", | 445 | .name = "hostap_pci", |
445 | .id_table = prism2_pci_id_table, | 446 | .id_table = prism2_pci_id_table, |
446 | .probe = prism2_pci_probe, | 447 | .probe = prism2_pci_probe, |
447 | .remove = prism2_pci_remove, | 448 | .remove = prism2_pci_remove, |
diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c index 474ef83d813e..78d67b408b2f 100644 --- a/drivers/net/wireless/hostap/hostap_plx.c +++ b/drivers/net/wireless/hostap/hostap_plx.c | |||
@@ -328,8 +328,6 @@ static struct prism2_helper_functions prism2_plx_funcs = | |||
328 | { | 328 | { |
329 | .card_present = NULL, | 329 | .card_present = NULL, |
330 | .cor_sreset = prism2_plx_cor_sreset, | 330 | .cor_sreset = prism2_plx_cor_sreset, |
331 | .dev_open = NULL, | ||
332 | .dev_close = NULL, | ||
333 | .genesis_reset = prism2_plx_genesis_reset, | 331 | .genesis_reset = prism2_plx_genesis_reset, |
334 | .hw_type = HOSTAP_HW_PLX, | 332 | .hw_type = HOSTAP_HW_PLX, |
335 | }; | 333 | }; |
@@ -570,10 +568,8 @@ static int prism2_plx_probe(struct pci_dev *pdev, | |||
570 | return hostap_hw_ready(dev); | 568 | return hostap_hw_ready(dev); |
571 | 569 | ||
572 | fail: | 570 | fail: |
573 | kfree(hw_priv); | ||
574 | if (local) | ||
575 | local->hw_priv = NULL; | ||
576 | prism2_free_local_data(dev); | 571 | prism2_free_local_data(dev); |
572 | kfree(hw_priv); | ||
577 | 573 | ||
578 | if (irq_registered && dev) | 574 | if (irq_registered && dev) |
579 | free_irq(dev->irq, dev); | 575 | free_irq(dev->irq, dev); |
@@ -606,9 +602,8 @@ static void prism2_plx_remove(struct pci_dev *pdev) | |||
606 | if (dev->irq) | 602 | if (dev->irq) |
607 | free_irq(dev->irq, dev); | 603 | free_irq(dev->irq, dev); |
608 | 604 | ||
609 | kfree(iface->local->hw_priv); | ||
610 | iface->local->hw_priv = NULL; | ||
611 | prism2_free_local_data(dev); | 605 | prism2_free_local_data(dev); |
606 | kfree(hw_priv); | ||
612 | pci_disable_device(pdev); | 607 | pci_disable_device(pdev); |
613 | } | 608 | } |
614 | 609 | ||
@@ -616,7 +611,7 @@ static void prism2_plx_remove(struct pci_dev *pdev) | |||
616 | MODULE_DEVICE_TABLE(pci, prism2_plx_id_table); | 611 | MODULE_DEVICE_TABLE(pci, prism2_plx_id_table); |
617 | 612 | ||
618 | static struct pci_driver prism2_plx_drv_id = { | 613 | static struct pci_driver prism2_plx_drv_id = { |
619 | .name = "prism2_plx", | 614 | .name = "hostap_plx", |
620 | .id_table = prism2_plx_id_table, | 615 | .id_table = prism2_plx_id_table, |
621 | .probe = prism2_plx_probe, | 616 | .probe = prism2_plx_probe, |
622 | .remove = prism2_plx_remove, | 617 | .remove = prism2_plx_remove, |
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h index cc061e1560d3..cfd801559492 100644 --- a/drivers/net/wireless/hostap/hostap_wlan.h +++ b/drivers/net/wireless/hostap/hostap_wlan.h | |||
@@ -552,8 +552,6 @@ struct prism2_helper_functions { | |||
552 | * (hostap_{cs,plx,pci}.c */ | 552 | * (hostap_{cs,plx,pci}.c */ |
553 | int (*card_present)(local_info_t *local); | 553 | int (*card_present)(local_info_t *local); |
554 | void (*cor_sreset)(local_info_t *local); | 554 | void (*cor_sreset)(local_info_t *local); |
555 | int (*dev_open)(local_info_t *local); | ||
556 | int (*dev_close)(local_info_t *local); | ||
557 | void (*genesis_reset)(local_info_t *local, int hcr); | 555 | void (*genesis_reset)(local_info_t *local, int hcr); |
558 | 556 | ||
559 | /* the following functions are from hostap_hw.c, but they may have some | 557 | /* the following functions are from hostap_hw.c, but they may have some |