diff options
Diffstat (limited to 'drivers/net/wireless/airo.c')
| -rw-r--r-- | drivers/net/wireless/airo.c | 105 |
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 | ||
| 2920 | err_out_wifi: | ||
| 2921 | unregister_netdev(ai->wifidev); | ||
| 2922 | free_netdev(ai->wifidev); | ||
| 2923 | err_out_reg: | ||
| 2924 | unregister_netdev(dev); | ||
| 2916 | err_out_map: | 2925 | err_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 | |||
| 4613 | fail_wepkey: | ||
| 4614 | remove_proc_entry("BSSList", apriv->proc_entry); | ||
| 4615 | fail_bsslist: | ||
| 4616 | remove_proc_entry("APList", apriv->proc_entry); | ||
| 4617 | fail_aplist: | ||
| 4618 | remove_proc_entry("SSID", apriv->proc_entry); | ||
| 4619 | fail_ssid: | ||
| 4620 | remove_proc_entry("Config", apriv->proc_entry); | ||
| 4621 | fail_config: | ||
| 4622 | remove_proc_entry("Status", apriv->proc_entry); | ||
| 4623 | fail_status: | ||
| 4624 | remove_proc_entry("Stats", apriv->proc_entry); | ||
| 4625 | fail_stats: | ||
| 4626 | remove_proc_entry("StatsDelta", apriv->proc_entry); | ||
| 4627 | fail_stats_delta: | ||
| 4628 | remove_proc_entry(apriv->proc_name, airo_entry); | ||
| 4629 | fail: | ||
| 4630 | return -ENOMEM; | ||
| 4583 | } | 4631 | } |
| 4584 | 4632 | ||
| 4585 | static int takedown_proc_entry( struct net_device *dev, | 4633 | static 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 ! */ |
