aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/hostap
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/net/wireless/hostap
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/net/wireless/hostap')
-rw-r--r--drivers/net/wireless/hostap/hostap_ap.c5
-rw-r--r--drivers/net/wireless/hostap/hostap_ap.h2
-rw-r--r--drivers/net/wireless/hostap/hostap_config.h4
-rw-r--r--drivers/net/wireless/hostap/hostap_cs.c117
-rw-r--r--drivers/net/wireless/hostap/hostap_hw.c10
-rw-r--r--drivers/net/wireless/hostap/hostap_ioctl.c6
-rw-r--r--drivers/net/wireless/hostap/hostap_main.c8
-rw-r--r--drivers/net/wireless/hostap/hostap_wlan.h2
8 files changed, 36 insertions, 118 deletions
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c
index dbb986946e1a..3d05dc15c6b8 100644
--- a/drivers/net/wireless/hostap/hostap_ap.c
+++ b/drivers/net/wireless/hostap/hostap_ap.c
@@ -858,7 +858,10 @@ void hostap_free_data(struct ap_data *ap)
858 return; 858 return;
859 } 859 }
860 860
861 flush_work_sync(&ap->add_sta_proc_queue);
862
861#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT 863#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
864 flush_work_sync(&ap->wds_oper_queue);
862 if (ap->crypt) 865 if (ap->crypt)
863 ap->crypt->deinit(ap->crypt_priv); 866 ap->crypt->deinit(ap->crypt_priv);
864 ap->crypt = ap->crypt_priv = NULL; 867 ap->crypt = ap->crypt_priv = NULL;
@@ -2356,7 +2359,7 @@ int prism2_ap_get_sta_qual(local_info_t *local, struct sockaddr addr[],
2356} 2359}
2357 2360
2358 2361
2359/* Translate our list of Access Points & Stations to a card independant 2362/* Translate our list of Access Points & Stations to a card independent
2360 * format that the Wireless Tools will understand - Jean II */ 2363 * format that the Wireless Tools will understand - Jean II */
2361int prism2_ap_translate_scan(struct net_device *dev, 2364int prism2_ap_translate_scan(struct net_device *dev,
2362 struct iw_request_info *info, char *buffer) 2365 struct iw_request_info *info, char *buffer)
diff --git a/drivers/net/wireless/hostap/hostap_ap.h b/drivers/net/wireless/hostap/hostap_ap.h
index 655ceeba9612..334e2d0b8e11 100644
--- a/drivers/net/wireless/hostap/hostap_ap.h
+++ b/drivers/net/wireless/hostap/hostap_ap.h
@@ -114,7 +114,7 @@ struct sta_info {
114 * has passed since last received frame from the station, a nullfunc data 114 * has passed since last received frame from the station, a nullfunc data
115 * frame is sent to the station. If this frame is not acknowledged and no other 115 * frame is sent to the station. If this frame is not acknowledged and no other
116 * frames have been received, the station will be disassociated after 116 * frames have been received, the station will be disassociated after
117 * AP_DISASSOC_DELAY. Similarily, a the station will be deauthenticated after 117 * AP_DISASSOC_DELAY. Similarly, a the station will be deauthenticated after
118 * AP_DEAUTH_DELAY. AP_TIMEOUT_RESOLUTION is the resolution that is used with 118 * AP_DEAUTH_DELAY. AP_TIMEOUT_RESOLUTION is the resolution that is used with
119 * max inactivity timer. */ 119 * max inactivity timer. */
120#define AP_MAX_INACTIVITY_SEC (5 * 60) 120#define AP_MAX_INACTIVITY_SEC (5 * 60)
diff --git a/drivers/net/wireless/hostap/hostap_config.h b/drivers/net/wireless/hostap/hostap_config.h
index 30acd39d76a2..2c8f71f0ed45 100644
--- a/drivers/net/wireless/hostap/hostap_config.h
+++ b/drivers/net/wireless/hostap/hostap_config.h
@@ -30,9 +30,9 @@
30 30
31/* Following defines can be used to remove unneeded parts of the driver, e.g., 31/* Following defines can be used to remove unneeded parts of the driver, e.g.,
32 * to limit the size of the kernel module. Definitions can be added here in 32 * to limit the size of the kernel module. Definitions can be added here in
33 * hostap_config.h or they can be added to make command with EXTRA_CFLAGS, 33 * hostap_config.h or they can be added to make command with ccflags-y,
34 * e.g., 34 * e.g.,
35 * 'make pccard EXTRA_CFLAGS="-DPRISM2_NO_DEBUG -DPRISM2_NO_PROCFS_DEBUG"' 35 * 'make pccard ccflags-y="-DPRISM2_NO_DEBUG -DPRISM2_NO_PROCFS_DEBUG"'
36 */ 36 */
37 37
38/* Do not include debug messages into the driver */ 38/* Do not include debug messages into the driver */
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c
index ba54d1b04d22..c052a0d5cbdd 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -12,7 +12,6 @@
12#include <linux/wireless.h> 12#include <linux/wireless.h>
13#include <net/iw_handler.h> 13#include <net/iw_handler.h>
14 14
15#include <pcmcia/cs.h>
16#include <pcmcia/cistpl.h> 15#include <pcmcia/cistpl.h>
17#include <pcmcia/cisreg.h> 16#include <pcmcia/cisreg.h>
18#include <pcmcia/ds.h> 17#include <pcmcia/ds.h>
@@ -437,7 +436,6 @@ static int hostap_cs_probe(struct pcmcia_device *p_dev)
437 int ret; 436 int ret;
438 437
439 PDEBUG(DEBUG_HW, "%s: setting Vcc=33 (constant)\n", dev_info); 438 PDEBUG(DEBUG_HW, "%s: setting Vcc=33 (constant)\n", dev_info);
440 p_dev->conf.IntType = INT_MEMORY_AND_IO;
441 439
442 ret = prism2_config(p_dev); 440 ret = prism2_config(p_dev);
443 if (ret) { 441 if (ret) {
@@ -468,74 +466,11 @@ static void prism2_detach(struct pcmcia_device *link)
468} 466}
469 467
470 468
471/* run after a CARD_INSERTION event is received to configure the PCMCIA 469static int prism2_config_check(struct pcmcia_device *p_dev, void *priv_data)
472 * socket and make the device available to the system */
473
474static int prism2_config_check(struct pcmcia_device *p_dev,
475 cistpl_cftable_entry_t *cfg,
476 cistpl_cftable_entry_t *dflt,
477 unsigned int vcc,
478 void *priv_data)
479{ 470{
480 if (cfg->index == 0) 471 if (p_dev->config_index == 0)
481 return -ENODEV; 472 return -EINVAL;
482
483 PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X "
484 "(default 0x%02X)\n", cfg->index, dflt->index);
485
486 /* Does this card need audio output? */
487 if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
488 p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
489 p_dev->conf.Status = CCSR_AUDIO_ENA;
490 }
491
492 /* Use power settings for Vcc and Vpp if present */
493 /* Note that the CIS values need to be rescaled */
494 if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
495 if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] /
496 10000 && !ignore_cis_vcc) {
497 PDEBUG(DEBUG_EXTRA, " Vcc mismatch - skipping"
498 " this entry\n");
499 return -ENODEV;
500 }
501 } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
502 if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] /
503 10000 && !ignore_cis_vcc) {
504 PDEBUG(DEBUG_EXTRA, " Vcc (default) mismatch "
505 "- skipping this entry\n");
506 return -ENODEV;
507 }
508 }
509
510 if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
511 p_dev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
512 else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
513 p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
514
515 /* Do we need to allocate an interrupt? */
516 p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
517
518 /* IO window settings */
519 PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d "
520 "dflt->io.nwin=%d\n",
521 cfg->io.nwin, dflt->io.nwin);
522 p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
523 if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
524 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
525 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
526 p_dev->resource[0]->flags |=
527 pcmcia_io_cfg_data_width(io->flags);
528 p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
529 p_dev->resource[0]->start = io->win[0].base;
530 p_dev->resource[0]->end = io->win[0].len;
531 if (io->nwin > 1) {
532 p_dev->resource[1]->flags = p_dev->resource[0]->flags;
533 p_dev->resource[1]->start = io->win[1].base;
534 p_dev->resource[1]->end = io->win[1].len;
535 }
536 }
537 473
538 /* This reserves IO space but doesn't actually enable it */
539 return pcmcia_request_io(p_dev); 474 return pcmcia_request_io(p_dev);
540} 475}
541 476
@@ -557,6 +492,10 @@ static int prism2_config(struct pcmcia_device *link)
557 } 492 }
558 493
559 /* Look for an appropriate configuration table entry in the CIS */ 494 /* Look for an appropriate configuration table entry in the CIS */
495 link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO |
496 CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ;
497 if (ignore_cis_vcc)
498 link->config_flags &= ~CONF_AUTO_CHECK_VCC;
560 ret = pcmcia_loop_config(link, prism2_config_check, NULL); 499 ret = pcmcia_loop_config(link, prism2_config_check, NULL);
561 if (ret) { 500 if (ret) {
562 if (!ignore_cis_vcc) 501 if (!ignore_cis_vcc)
@@ -579,43 +518,23 @@ static int prism2_config(struct pcmcia_device *link)
579 hw_priv->link = link; 518 hw_priv->link = link;
580 519
581 /* 520 /*
582 * Make sure the IRQ handler cannot proceed until at least 521 * We enable IRQ here, but IRQ handler will not proceed
583 * dev->base_addr is initialized. 522 * until dev->base_addr is set below. This protect us from
523 * receive interrupts when driver is not initialized.
584 */ 524 */
585 spin_lock_irqsave(&local->irq_init_lock, flags);
586
587 ret = pcmcia_request_irq(link, prism2_interrupt); 525 ret = pcmcia_request_irq(link, prism2_interrupt);
588 if (ret) 526 if (ret)
589 goto failed_unlock; 527 goto failed;
590 528
591 /* 529 ret = pcmcia_enable_device(link);
592 * This actually configures the PCMCIA socket -- setting up
593 * the I/O windows and the interrupt mapping, and putting the
594 * card and host interface into "Memory and IO" mode.
595 */
596 ret = pcmcia_request_configuration(link, &link->conf);
597 if (ret) 530 if (ret)
598 goto failed_unlock; 531 goto failed;
599 532
533 spin_lock_irqsave(&local->irq_init_lock, flags);
600 dev->irq = link->irq; 534 dev->irq = link->irq;
601 dev->base_addr = link->resource[0]->start; 535 dev->base_addr = link->resource[0]->start;
602
603 spin_unlock_irqrestore(&local->irq_init_lock, flags); 536 spin_unlock_irqrestore(&local->irq_init_lock, flags);
604 537
605 /* Finally, report what we've done */
606 printk(KERN_INFO "%s: index 0x%02x: ",
607 dev_info, link->conf.ConfigIndex);
608 if (link->conf.Vpp)
609 printk(", Vpp %d.%d", link->conf.Vpp / 10,
610 link->conf.Vpp % 10);
611 if (link->conf.Attributes & CONF_ENABLE_IRQ)
612 printk(", irq %d", link->irq);
613 if (link->resource[0])
614 printk(" & %pR", link->resource[0]);
615 if (link->resource[1])
616 printk(" & %pR", link->resource[1]);
617 printk("\n");
618
619 local->shutdown = 0; 538 local->shutdown = 0;
620 539
621 sandisk_enable_wireless(dev); 540 sandisk_enable_wireless(dev);
@@ -626,8 +545,6 @@ static int prism2_config(struct pcmcia_device *link)
626 545
627 return ret; 546 return ret;
628 547
629 failed_unlock:
630 spin_unlock_irqrestore(&local->irq_init_lock, flags);
631 failed: 548 failed:
632 kfree(hw_priv); 549 kfree(hw_priv);
633 prism2_release((u_long)link); 550 prism2_release((u_long)link);
@@ -703,7 +620,7 @@ static int hostap_cs_resume(struct pcmcia_device *link)
703 return 0; 620 return 0;
704} 621}
705 622
706static struct pcmcia_device_id hostap_cs_ids[] = { 623static const struct pcmcia_device_id hostap_cs_ids[] = {
707 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), 624 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100),
708 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), 625 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300),
709 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), 626 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777),
@@ -779,9 +696,7 @@ MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids);
779 696
780 697
781static struct pcmcia_driver hostap_driver = { 698static struct pcmcia_driver hostap_driver = {
782 .drv = { 699 .name = "hostap_cs",
783 .name = "hostap_cs",
784 },
785 .probe = hostap_cs_probe, 700 .probe = hostap_cs_probe,
786 .remove = prism2_detach, 701 .remove = prism2_detach,
787 .owner = THIS_MODULE, 702 .owner = THIS_MODULE,
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c
index e9d9d622a9b0..a8bddd81b4d1 100644
--- a/drivers/net/wireless/hostap/hostap_hw.c
+++ b/drivers/net/wireless/hostap/hostap_hw.c
@@ -2621,7 +2621,7 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id)
2621 iface = netdev_priv(dev); 2621 iface = netdev_priv(dev);
2622 local = iface->local; 2622 local = iface->local;
2623 2623
2624 /* Detect early interrupt before driver is fully configued */ 2624 /* Detect early interrupt before driver is fully configured */
2625 spin_lock(&local->irq_init_lock); 2625 spin_lock(&local->irq_init_lock);
2626 if (!dev->base_addr) { 2626 if (!dev->base_addr) {
2627 if (net_ratelimit()) { 2627 if (net_ratelimit()) {
@@ -3317,7 +3317,13 @@ static void prism2_free_local_data(struct net_device *dev)
3317 3317
3318 unregister_netdev(local->dev); 3318 unregister_netdev(local->dev);
3319 3319
3320 flush_scheduled_work(); 3320 flush_work_sync(&local->reset_queue);
3321 flush_work_sync(&local->set_multicast_list_queue);
3322 flush_work_sync(&local->set_tim_queue);
3323#ifndef PRISM2_NO_STATION_MODES
3324 flush_work_sync(&local->info_queue);
3325#endif
3326 flush_work_sync(&local->comms_qual_update);
3321 3327
3322 lib80211_crypt_info_free(&local->crypt_info); 3328 lib80211_crypt_info_free(&local->crypt_info);
3323 3329
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c
index a85e43a8d758..12de46407c71 100644
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
@@ -1696,7 +1696,7 @@ static int prism2_request_scan(struct net_device *dev)
1696 hostap_set_word(dev, HFA384X_RID_CNFROAMINGMODE, 1696 hostap_set_word(dev, HFA384X_RID_CNFROAMINGMODE,
1697 HFA384X_ROAMING_FIRMWARE); 1697 HFA384X_ROAMING_FIRMWARE);
1698 1698
1699 return 0; 1699 return ret;
1700} 1700}
1701 1701
1702#else /* !PRISM2_NO_STATION_MODES */ 1702#else /* !PRISM2_NO_STATION_MODES */
@@ -1945,7 +1945,7 @@ static char * __prism2_translate_scan(local_info_t *local,
1945} 1945}
1946 1946
1947 1947
1948/* Translate scan data returned from the card to a card independant 1948/* Translate scan data returned from the card to a card independent
1949 * format that the Wireless Tools will understand - Jean II */ 1949 * format that the Wireless Tools will understand - Jean II */
1950static inline int prism2_translate_scan(local_info_t *local, 1950static inline int prism2_translate_scan(local_info_t *local,
1951 struct iw_request_info *info, 1951 struct iw_request_info *info,
@@ -2043,7 +2043,7 @@ static inline int prism2_ioctl_giwscan_sta(struct net_device *dev,
2043 * until results are ready for various reasons. 2043 * until results are ready for various reasons.
2044 * First, managing wait queues is complex and racy 2044 * First, managing wait queues is complex and racy
2045 * (there may be multiple simultaneous callers). 2045 * (there may be multiple simultaneous callers).
2046 * Second, we grab some rtnetlink lock before comming 2046 * Second, we grab some rtnetlink lock before coming
2047 * here (in dev_ioctl()). 2047 * here (in dev_ioctl()).
2048 * Third, the caller can wait on the Wireless Event 2048 * Third, the caller can wait on the Wireless Event
2049 * - Jean II */ 2049 * - Jean II */
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
index 25a2722c8a98..d5084829c9e5 100644
--- a/drivers/net/wireless/hostap/hostap_main.c
+++ b/drivers/net/wireless/hostap/hostap_main.c
@@ -79,13 +79,8 @@ struct net_device * hostap_add_interface(struct local_info *local,
79 if (!rtnl_locked) 79 if (!rtnl_locked)
80 rtnl_lock(); 80 rtnl_lock();
81 81
82 ret = 0;
83 if (strchr(dev->name, '%'))
84 ret = dev_alloc_name(dev, dev->name);
85
86 SET_NETDEV_DEV(dev, mdev->dev.parent); 82 SET_NETDEV_DEV(dev, mdev->dev.parent);
87 if (ret >= 0) 83 ret = register_netdevice(dev);
88 ret = register_netdevice(dev);
89 84
90 if (!rtnl_locked) 85 if (!rtnl_locked)
91 rtnl_unlock(); 86 rtnl_unlock();
@@ -891,7 +886,6 @@ void hostap_setup_dev(struct net_device *dev, local_info_t *local,
891 886
892 SET_ETHTOOL_OPS(dev, &prism2_ethtool_ops); 887 SET_ETHTOOL_OPS(dev, &prism2_ethtool_ops);
893 888
894 netif_stop_queue(dev);
895} 889}
896 890
897static int hostap_enable_hostapd(local_info_t *local, int rtnl_locked) 891static int hostap_enable_hostapd(local_info_t *local, int rtnl_locked)
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h
index 1c66b3c1030d..88dc6a52bdf1 100644
--- a/drivers/net/wireless/hostap/hostap_wlan.h
+++ b/drivers/net/wireless/hostap/hostap_wlan.h
@@ -853,7 +853,7 @@ struct local_info {
853 struct work_struct comms_qual_update; 853 struct work_struct comms_qual_update;
854 854
855 /* RSSI to dBm adjustment (for RX descriptor fields) */ 855 /* RSSI to dBm adjustment (for RX descriptor fields) */
856 int rssi_to_dBm; /* substract from RSSI to get approximate dBm value */ 856 int rssi_to_dBm; /* subtract from RSSI to get approximate dBm value */
857 857
858 /* BSS list / protected by local->lock */ 858 /* BSS list / protected by local->lock */
859 struct list_head bss_list; 859 struct list_head bss_list;