aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/airo.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/airo.c')
-rw-r--r--drivers/net/wireless/airo.c105
1 files changed, 76 insertions, 29 deletions
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index 0a33c8a56e13..efcdaf1c5f73 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -2897,6 +2897,8 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
2897 goto err_out_map; 2897 goto err_out_map;
2898 } 2898 }
2899 ai->wifidev = init_wifidev(ai, dev); 2899 ai->wifidev = init_wifidev(ai, dev);
2900 if (!ai->wifidev)
2901 goto err_out_reg;
2900 2902
2901 set_bit(FLAG_REGISTERED,&ai->flags); 2903 set_bit(FLAG_REGISTERED,&ai->flags);
2902 airo_print_info(dev->name, "MAC enabled %x:%x:%x:%x:%x:%x", 2904 airo_print_info(dev->name, "MAC enabled %x:%x:%x:%x:%x:%x",
@@ -2908,11 +2910,18 @@ static struct net_device *_init_airo_card( unsigned short irq, int port,
2908 for( i = 0; i < MAX_FIDS; i++ ) 2910 for( i = 0; i < MAX_FIDS; i++ )
2909 ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2); 2911 ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2);
2910 2912
2911 setup_proc_entry( dev, dev->priv ); /* XXX check for failure */ 2913 if (setup_proc_entry(dev, dev->priv) < 0)
2914 goto err_out_wifi;
2915
2912 netif_start_queue(dev); 2916 netif_start_queue(dev);
2913 SET_MODULE_OWNER(dev); 2917 SET_MODULE_OWNER(dev);
2914 return dev; 2918 return dev;
2915 2919
2920err_out_wifi:
2921 unregister_netdev(ai->wifidev);
2922 free_netdev(ai->wifidev);
2923err_out_reg:
2924 unregister_netdev(dev);
2916err_out_map: 2925err_out_map:
2917 if (test_bit(FLAG_MPI,&ai->flags) && pci) { 2926 if (test_bit(FLAG_MPI,&ai->flags) && pci) {
2918 pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma); 2927 pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma);
@@ -3089,7 +3098,8 @@ static int airo_thread(void *data) {
3089 set_bit(JOB_AUTOWEP, &ai->jobs); 3098 set_bit(JOB_AUTOWEP, &ai->jobs);
3090 break; 3099 break;
3091 } 3100 }
3092 if (!kthread_should_stop()) { 3101 if (!kthread_should_stop() &&
3102 !freezing(current)) {
3093 unsigned long wake_at; 3103 unsigned long wake_at;
3094 if (!ai->expires || !ai->scan_timeout) { 3104 if (!ai->expires || !ai->scan_timeout) {
3095 wake_at = max(ai->expires, 3105 wake_at = max(ai->expires,
@@ -3101,7 +3111,8 @@ static int airo_thread(void *data) {
3101 schedule_timeout(wake_at - jiffies); 3111 schedule_timeout(wake_at - jiffies);
3102 continue; 3112 continue;
3103 } 3113 }
3104 } else if (!kthread_should_stop()) { 3114 } else if (!kthread_should_stop() &&
3115 !freezing(current)) {
3105 schedule(); 3116 schedule();
3106 continue; 3117 continue;
3107 } 3118 }
@@ -4495,91 +4506,128 @@ static int setup_proc_entry( struct net_device *dev,
4495 apriv->proc_entry = create_proc_entry(apriv->proc_name, 4506 apriv->proc_entry = create_proc_entry(apriv->proc_name,
4496 S_IFDIR|airo_perm, 4507 S_IFDIR|airo_perm,
4497 airo_entry); 4508 airo_entry);
4498 apriv->proc_entry->uid = proc_uid; 4509 if (!apriv->proc_entry)
4499 apriv->proc_entry->gid = proc_gid; 4510 goto fail;
4500 apriv->proc_entry->owner = THIS_MODULE; 4511 apriv->proc_entry->uid = proc_uid;
4512 apriv->proc_entry->gid = proc_gid;
4513 apriv->proc_entry->owner = THIS_MODULE;
4501 4514
4502 /* Setup the StatsDelta */ 4515 /* Setup the StatsDelta */
4503 entry = create_proc_entry("StatsDelta", 4516 entry = create_proc_entry("StatsDelta",
4504 S_IFREG | (S_IRUGO&proc_perm), 4517 S_IFREG | (S_IRUGO&proc_perm),
4505 apriv->proc_entry); 4518 apriv->proc_entry);
4506 entry->uid = proc_uid; 4519 if (!entry)
4507 entry->gid = proc_gid; 4520 goto fail_stats_delta;
4521 entry->uid = proc_uid;
4522 entry->gid = proc_gid;
4508 entry->data = dev; 4523 entry->data = dev;
4509 entry->owner = THIS_MODULE; 4524 entry->owner = THIS_MODULE;
4510 SETPROC_OPS(entry, proc_statsdelta_ops); 4525 SETPROC_OPS(entry, proc_statsdelta_ops);
4511 4526
4512 /* Setup the Stats */ 4527 /* Setup the Stats */
4513 entry = create_proc_entry("Stats", 4528 entry = create_proc_entry("Stats",
4514 S_IFREG | (S_IRUGO&proc_perm), 4529 S_IFREG | (S_IRUGO&proc_perm),
4515 apriv->proc_entry); 4530 apriv->proc_entry);
4516 entry->uid = proc_uid; 4531 if (!entry)
4517 entry->gid = proc_gid; 4532 goto fail_stats;
4533 entry->uid = proc_uid;
4534 entry->gid = proc_gid;
4518 entry->data = dev; 4535 entry->data = dev;
4519 entry->owner = THIS_MODULE; 4536 entry->owner = THIS_MODULE;
4520 SETPROC_OPS(entry, proc_stats_ops); 4537 SETPROC_OPS(entry, proc_stats_ops);
4521 4538
4522 /* Setup the Status */ 4539 /* Setup the Status */
4523 entry = create_proc_entry("Status", 4540 entry = create_proc_entry("Status",
4524 S_IFREG | (S_IRUGO&proc_perm), 4541 S_IFREG | (S_IRUGO&proc_perm),
4525 apriv->proc_entry); 4542 apriv->proc_entry);
4526 entry->uid = proc_uid; 4543 if (!entry)
4527 entry->gid = proc_gid; 4544 goto fail_status;
4545 entry->uid = proc_uid;
4546 entry->gid = proc_gid;
4528 entry->data = dev; 4547 entry->data = dev;
4529 entry->owner = THIS_MODULE; 4548 entry->owner = THIS_MODULE;
4530 SETPROC_OPS(entry, proc_status_ops); 4549 SETPROC_OPS(entry, proc_status_ops);
4531 4550
4532 /* Setup the Config */ 4551 /* Setup the Config */
4533 entry = create_proc_entry("Config", 4552 entry = create_proc_entry("Config",
4534 S_IFREG | proc_perm, 4553 S_IFREG | proc_perm,
4535 apriv->proc_entry); 4554 apriv->proc_entry);
4536 entry->uid = proc_uid; 4555 if (!entry)
4537 entry->gid = proc_gid; 4556 goto fail_config;
4557 entry->uid = proc_uid;
4558 entry->gid = proc_gid;
4538 entry->data = dev; 4559 entry->data = dev;
4539 entry->owner = THIS_MODULE; 4560 entry->owner = THIS_MODULE;
4540 SETPROC_OPS(entry, proc_config_ops); 4561 SETPROC_OPS(entry, proc_config_ops);
4541 4562
4542 /* Setup the SSID */ 4563 /* Setup the SSID */
4543 entry = create_proc_entry("SSID", 4564 entry = create_proc_entry("SSID",
4544 S_IFREG | proc_perm, 4565 S_IFREG | proc_perm,
4545 apriv->proc_entry); 4566 apriv->proc_entry);
4546 entry->uid = proc_uid; 4567 if (!entry)
4547 entry->gid = proc_gid; 4568 goto fail_ssid;
4569 entry->uid = proc_uid;
4570 entry->gid = proc_gid;
4548 entry->data = dev; 4571 entry->data = dev;
4549 entry->owner = THIS_MODULE; 4572 entry->owner = THIS_MODULE;
4550 SETPROC_OPS(entry, proc_SSID_ops); 4573 SETPROC_OPS(entry, proc_SSID_ops);
4551 4574
4552 /* Setup the APList */ 4575 /* Setup the APList */
4553 entry = create_proc_entry("APList", 4576 entry = create_proc_entry("APList",
4554 S_IFREG | proc_perm, 4577 S_IFREG | proc_perm,
4555 apriv->proc_entry); 4578 apriv->proc_entry);
4556 entry->uid = proc_uid; 4579 if (!entry)
4557 entry->gid = proc_gid; 4580 goto fail_aplist;
4581 entry->uid = proc_uid;
4582 entry->gid = proc_gid;
4558 entry->data = dev; 4583 entry->data = dev;
4559 entry->owner = THIS_MODULE; 4584 entry->owner = THIS_MODULE;
4560 SETPROC_OPS(entry, proc_APList_ops); 4585 SETPROC_OPS(entry, proc_APList_ops);
4561 4586
4562 /* Setup the BSSList */ 4587 /* Setup the BSSList */
4563 entry = create_proc_entry("BSSList", 4588 entry = create_proc_entry("BSSList",
4564 S_IFREG | proc_perm, 4589 S_IFREG | proc_perm,
4565 apriv->proc_entry); 4590 apriv->proc_entry);
4591 if (!entry)
4592 goto fail_bsslist;
4566 entry->uid = proc_uid; 4593 entry->uid = proc_uid;
4567 entry->gid = proc_gid; 4594 entry->gid = proc_gid;
4568 entry->data = dev; 4595 entry->data = dev;
4569 entry->owner = THIS_MODULE; 4596 entry->owner = THIS_MODULE;
4570 SETPROC_OPS(entry, proc_BSSList_ops); 4597 SETPROC_OPS(entry, proc_BSSList_ops);
4571 4598
4572 /* Setup the WepKey */ 4599 /* Setup the WepKey */
4573 entry = create_proc_entry("WepKey", 4600 entry = create_proc_entry("WepKey",
4574 S_IFREG | proc_perm, 4601 S_IFREG | proc_perm,
4575 apriv->proc_entry); 4602 apriv->proc_entry);
4576 entry->uid = proc_uid; 4603 if (!entry)
4577 entry->gid = proc_gid; 4604 goto fail_wepkey;
4605 entry->uid = proc_uid;
4606 entry->gid = proc_gid;
4578 entry->data = dev; 4607 entry->data = dev;
4579 entry->owner = THIS_MODULE; 4608 entry->owner = THIS_MODULE;
4580 SETPROC_OPS(entry, proc_wepkey_ops); 4609 SETPROC_OPS(entry, proc_wepkey_ops);
4581 4610
4582 return 0; 4611 return 0;
4612
4613fail_wepkey:
4614 remove_proc_entry("BSSList", apriv->proc_entry);
4615fail_bsslist:
4616 remove_proc_entry("APList", apriv->proc_entry);
4617fail_aplist:
4618 remove_proc_entry("SSID", apriv->proc_entry);
4619fail_ssid:
4620 remove_proc_entry("Config", apriv->proc_entry);
4621fail_config:
4622 remove_proc_entry("Status", apriv->proc_entry);
4623fail_status:
4624 remove_proc_entry("Stats", apriv->proc_entry);
4625fail_stats:
4626 remove_proc_entry("StatsDelta", apriv->proc_entry);
4627fail_stats_delta:
4628 remove_proc_entry(apriv->proc_name, airo_entry);
4629fail:
4630 return -ENOMEM;
4583} 4631}
4584 4632
4585static int takedown_proc_entry( struct net_device *dev, 4633static int takedown_proc_entry( struct net_device *dev,
@@ -5924,7 +5972,6 @@ static int airo_get_essid(struct net_device *dev,
5924 5972
5925 /* Get the current SSID */ 5973 /* Get the current SSID */
5926 memcpy(extra, status_rid.SSID, status_rid.SSIDlen); 5974 memcpy(extra, status_rid.SSID, status_rid.SSIDlen);
5927 extra[status_rid.SSIDlen] = '\0';
5928 /* If none, we may want to get the one that was set */ 5975 /* If none, we may want to get the one that was set */
5929 5976
5930 /* Push it out ! */ 5977 /* Push it out ! */