diff options
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2100.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 141 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/libipw.h | 8 | ||||
| -rw-r--r-- | drivers/net/wireless/ipw2x00/libipw_module.c | 42 |
4 files changed, 36 insertions, 161 deletions
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 240cff1e6979..6e2fc0cb6f8a 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c | |||
| @@ -6029,7 +6029,7 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, | |||
| 6029 | struct ipw2100_priv *priv; | 6029 | struct ipw2100_priv *priv; |
| 6030 | struct net_device *dev; | 6030 | struct net_device *dev; |
| 6031 | 6031 | ||
| 6032 | dev = alloc_ieee80211(sizeof(struct ipw2100_priv), 0); | 6032 | dev = alloc_ieee80211(sizeof(struct ipw2100_priv)); |
| 6033 | if (!dev) | 6033 | if (!dev) |
| 6034 | return NULL; | 6034 | return NULL; |
| 6035 | priv = libipw_priv(dev); | 6035 | priv = libipw_priv(dev); |
| @@ -6342,7 +6342,7 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
| 6342 | sysfs_remove_group(&pci_dev->dev.kobj, | 6342 | sysfs_remove_group(&pci_dev->dev.kobj, |
| 6343 | &ipw2100_attribute_group); | 6343 | &ipw2100_attribute_group); |
| 6344 | 6344 | ||
| 6345 | free_ieee80211(dev, 0); | 6345 | free_ieee80211(dev); |
| 6346 | pci_set_drvdata(pci_dev, NULL); | 6346 | pci_set_drvdata(pci_dev, NULL); |
| 6347 | } | 6347 | } |
| 6348 | 6348 | ||
| @@ -6400,7 +6400,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) | |||
| 6400 | if (dev->base_addr) | 6400 | if (dev->base_addr) |
| 6401 | iounmap((void __iomem *)dev->base_addr); | 6401 | iounmap((void __iomem *)dev->base_addr); |
| 6402 | 6402 | ||
| 6403 | free_ieee80211(dev, 0); | 6403 | free_ieee80211(dev); |
| 6404 | } | 6404 | } |
| 6405 | 6405 | ||
| 6406 | pci_release_regions(pci_dev); | 6406 | pci_release_regions(pci_dev); |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 8d58e6ed4e7d..0d30a9e2d3df 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
| @@ -103,25 +103,6 @@ static int antenna = CFG_SYS_ANTENNA_BOTH; | |||
| 103 | static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ | 103 | static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ |
| 104 | #endif | 104 | #endif |
| 105 | 105 | ||
| 106 | static struct ieee80211_rate ipw2200_rates[] = { | ||
| 107 | { .bitrate = 10 }, | ||
| 108 | { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, | ||
| 109 | { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, | ||
| 110 | { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, | ||
| 111 | { .bitrate = 60 }, | ||
| 112 | { .bitrate = 90 }, | ||
| 113 | { .bitrate = 120 }, | ||
| 114 | { .bitrate = 180 }, | ||
| 115 | { .bitrate = 240 }, | ||
| 116 | { .bitrate = 360 }, | ||
| 117 | { .bitrate = 480 }, | ||
| 118 | { .bitrate = 540 } | ||
| 119 | }; | ||
| 120 | |||
| 121 | #define ipw2200_a_rates (ipw2200_rates + 4) | ||
| 122 | #define ipw2200_num_a_rates 8 | ||
| 123 | #define ipw2200_bg_rates (ipw2200_rates + 0) | ||
| 124 | #define ipw2200_num_bg_rates 12 | ||
| 125 | 106 | ||
| 126 | #ifdef CONFIG_IPW2200_QOS | 107 | #ifdef CONFIG_IPW2200_QOS |
| 127 | static int qos_enable = 0; | 108 | static int qos_enable = 0; |
| @@ -8673,6 +8654,24 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) | |||
| 8673 | * | 8654 | * |
| 8674 | */ | 8655 | */ |
| 8675 | 8656 | ||
| 8657 | static int ipw_wx_get_name(struct net_device *dev, | ||
| 8658 | struct iw_request_info *info, | ||
| 8659 | union iwreq_data *wrqu, char *extra) | ||
| 8660 | { | ||
| 8661 | struct ipw_priv *priv = libipw_priv(dev); | ||
| 8662 | mutex_lock(&priv->mutex); | ||
| 8663 | if (priv->status & STATUS_RF_KILL_MASK) | ||
| 8664 | strcpy(wrqu->name, "radio off"); | ||
| 8665 | else if (!(priv->status & STATUS_ASSOCIATED)) | ||
| 8666 | strcpy(wrqu->name, "unassociated"); | ||
| 8667 | else | ||
| 8668 | snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", | ||
| 8669 | ipw_modes[priv->assoc_request.ieee_mode]); | ||
| 8670 | IPW_DEBUG_WX("Name: %s\n", wrqu->name); | ||
| 8671 | mutex_unlock(&priv->mutex); | ||
| 8672 | return 0; | ||
| 8673 | } | ||
| 8674 | |||
| 8676 | static int ipw_set_channel(struct ipw_priv *priv, u8 channel) | 8675 | static int ipw_set_channel(struct ipw_priv *priv, u8 channel) |
| 8677 | { | 8676 | { |
| 8678 | if (channel == 0) { | 8677 | if (channel == 0) { |
| @@ -9972,7 +9971,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, | |||
| 9972 | /* Rebase the WE IOCTLs to zero for the handler array */ | 9971 | /* Rebase the WE IOCTLs to zero for the handler array */ |
| 9973 | #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] | 9972 | #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] |
| 9974 | static iw_handler ipw_wx_handlers[] = { | 9973 | static iw_handler ipw_wx_handlers[] = { |
| 9975 | IW_IOCTL(SIOCGIWNAME) = (iw_handler) cfg80211_wext_giwname, | 9974 | IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name, |
| 9976 | IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq, | 9975 | IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq, |
| 9977 | IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, | 9976 | IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, |
| 9978 | IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, | 9977 | IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, |
| @@ -11416,100 +11415,16 @@ static void ipw_bg_down(struct work_struct *work) | |||
| 11416 | /* Called by register_netdev() */ | 11415 | /* Called by register_netdev() */ |
| 11417 | static int ipw_net_init(struct net_device *dev) | 11416 | static int ipw_net_init(struct net_device *dev) |
| 11418 | { | 11417 | { |
| 11419 | int i, rc = 0; | ||
| 11420 | struct ipw_priv *priv = libipw_priv(dev); | 11418 | struct ipw_priv *priv = libipw_priv(dev); |
| 11421 | const struct libipw_geo *geo = libipw_get_geo(priv->ieee); | ||
| 11422 | struct wireless_dev *wdev = &priv->ieee->wdev; | ||
| 11423 | mutex_lock(&priv->mutex); | 11419 | mutex_lock(&priv->mutex); |
| 11424 | 11420 | ||
| 11425 | if (ipw_up(priv)) { | 11421 | if (ipw_up(priv)) { |
| 11426 | rc = -EIO; | 11422 | mutex_unlock(&priv->mutex); |
| 11427 | goto out; | 11423 | return -EIO; |
| 11428 | } | ||
| 11429 | |||
| 11430 | memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); | ||
| 11431 | |||
| 11432 | /* fill-out priv->ieee->bg_band */ | ||
| 11433 | if (geo->bg_channels) { | ||
| 11434 | struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; | ||
| 11435 | |||
| 11436 | bg_band->band = IEEE80211_BAND_2GHZ; | ||
| 11437 | bg_band->n_channels = geo->bg_channels; | ||
| 11438 | bg_band->channels = | ||
| 11439 | kzalloc(geo->bg_channels * | ||
| 11440 | sizeof(struct ieee80211_channel), GFP_KERNEL); | ||
| 11441 | /* translate geo->bg to bg_band.channels */ | ||
| 11442 | for (i = 0; i < geo->bg_channels; i++) { | ||
| 11443 | bg_band->channels[i].band = IEEE80211_BAND_2GHZ; | ||
| 11444 | bg_band->channels[i].center_freq = geo->bg[i].freq; | ||
| 11445 | bg_band->channels[i].hw_value = geo->bg[i].channel; | ||
| 11446 | bg_band->channels[i].max_power = geo->bg[i].max_power; | ||
| 11447 | if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) | ||
| 11448 | bg_band->channels[i].flags |= | ||
| 11449 | IEEE80211_CHAN_PASSIVE_SCAN; | ||
| 11450 | if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) | ||
| 11451 | bg_band->channels[i].flags |= | ||
| 11452 | IEEE80211_CHAN_NO_IBSS; | ||
| 11453 | if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) | ||
| 11454 | bg_band->channels[i].flags |= | ||
| 11455 | IEEE80211_CHAN_RADAR; | ||
| 11456 | /* No equivalent for LIBIPW_CH_80211H_RULES, | ||
| 11457 | LIBIPW_CH_UNIFORM_SPREADING, or | ||
| 11458 | LIBIPW_CH_B_ONLY... */ | ||
| 11459 | } | ||
| 11460 | /* point at bitrate info */ | ||
| 11461 | bg_band->bitrates = ipw2200_bg_rates; | ||
| 11462 | bg_band->n_bitrates = ipw2200_num_bg_rates; | ||
| 11463 | |||
| 11464 | wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = bg_band; | ||
| 11465 | } | ||
| 11466 | |||
| 11467 | /* fill-out priv->ieee->a_band */ | ||
| 11468 | if (geo->a_channels) { | ||
| 11469 | struct ieee80211_supported_band *a_band = &priv->ieee->a_band; | ||
| 11470 | |||
| 11471 | a_band->band = IEEE80211_BAND_5GHZ; | ||
| 11472 | a_band->n_channels = geo->a_channels; | ||
| 11473 | a_band->channels = | ||
| 11474 | kzalloc(geo->a_channels * | ||
| 11475 | sizeof(struct ieee80211_channel), GFP_KERNEL); | ||
| 11476 | /* translate geo->bg to a_band.channels */ | ||
| 11477 | for (i = 0; i < geo->a_channels; i++) { | ||
| 11478 | a_band->channels[i].band = IEEE80211_BAND_2GHZ; | ||
| 11479 | a_band->channels[i].center_freq = geo->a[i].freq; | ||
| 11480 | a_band->channels[i].hw_value = geo->a[i].channel; | ||
| 11481 | a_band->channels[i].max_power = geo->a[i].max_power; | ||
| 11482 | if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY) | ||
| 11483 | a_band->channels[i].flags |= | ||
| 11484 | IEEE80211_CHAN_PASSIVE_SCAN; | ||
| 11485 | if (geo->a[i].flags & LIBIPW_CH_NO_IBSS) | ||
| 11486 | a_band->channels[i].flags |= | ||
| 11487 | IEEE80211_CHAN_NO_IBSS; | ||
| 11488 | if (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT) | ||
| 11489 | a_band->channels[i].flags |= | ||
| 11490 | IEEE80211_CHAN_RADAR; | ||
| 11491 | /* No equivalent for LIBIPW_CH_80211H_RULES, | ||
| 11492 | LIBIPW_CH_UNIFORM_SPREADING, or | ||
| 11493 | LIBIPW_CH_B_ONLY... */ | ||
| 11494 | } | ||
| 11495 | /* point at bitrate info */ | ||
| 11496 | a_band->bitrates = ipw2200_a_rates; | ||
| 11497 | a_band->n_bitrates = ipw2200_num_a_rates; | ||
| 11498 | |||
| 11499 | wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = a_band; | ||
| 11500 | } | ||
| 11501 | |||
| 11502 | set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); | ||
| 11503 | |||
| 11504 | /* With that information in place, we can now register the wiphy... */ | ||
| 11505 | if (wiphy_register(wdev->wiphy)) { | ||
| 11506 | rc = -EIO; | ||
| 11507 | goto out; | ||
| 11508 | } | 11424 | } |
| 11509 | 11425 | ||
| 11510 | out: | ||
| 11511 | mutex_unlock(&priv->mutex); | 11426 | mutex_unlock(&priv->mutex); |
| 11512 | return rc; | 11427 | return 0; |
| 11513 | } | 11428 | } |
| 11514 | 11429 | ||
| 11515 | /* PCI driver stuff */ | 11430 | /* PCI driver stuff */ |
| @@ -11640,7 +11555,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv) | |||
| 11640 | if (priv->prom_net_dev) | 11555 | if (priv->prom_net_dev) |
| 11641 | return -EPERM; | 11556 | return -EPERM; |
| 11642 | 11557 | ||
| 11643 | priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv), 1); | 11558 | priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv)); |
| 11644 | if (priv->prom_net_dev == NULL) | 11559 | if (priv->prom_net_dev == NULL) |
| 11645 | return -ENOMEM; | 11560 | return -ENOMEM; |
| 11646 | 11561 | ||
| @@ -11659,7 +11574,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv) | |||
| 11659 | 11574 | ||
| 11660 | rc = register_netdev(priv->prom_net_dev); | 11575 | rc = register_netdev(priv->prom_net_dev); |
| 11661 | if (rc) { | 11576 | if (rc) { |
| 11662 | free_ieee80211(priv->prom_net_dev, 1); | 11577 | free_ieee80211(priv->prom_net_dev); |
| 11663 | priv->prom_net_dev = NULL; | 11578 | priv->prom_net_dev = NULL; |
| 11664 | return rc; | 11579 | return rc; |
| 11665 | } | 11580 | } |
| @@ -11673,7 +11588,7 @@ static void ipw_prom_free(struct ipw_priv *priv) | |||
| 11673 | return; | 11588 | return; |
| 11674 | 11589 | ||
| 11675 | unregister_netdev(priv->prom_net_dev); | 11590 | unregister_netdev(priv->prom_net_dev); |
| 11676 | free_ieee80211(priv->prom_net_dev, 1); | 11591 | free_ieee80211(priv->prom_net_dev); |
| 11677 | 11592 | ||
| 11678 | priv->prom_net_dev = NULL; | 11593 | priv->prom_net_dev = NULL; |
| 11679 | } | 11594 | } |
| @@ -11701,7 +11616,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
| 11701 | struct ipw_priv *priv; | 11616 | struct ipw_priv *priv; |
| 11702 | int i; | 11617 | int i; |
| 11703 | 11618 | ||
| 11704 | net_dev = alloc_ieee80211(sizeof(struct ipw_priv), 0); | 11619 | net_dev = alloc_ieee80211(sizeof(struct ipw_priv)); |
| 11705 | if (net_dev == NULL) { | 11620 | if (net_dev == NULL) { |
| 11706 | err = -ENOMEM; | 11621 | err = -ENOMEM; |
| 11707 | goto out; | 11622 | goto out; |
| @@ -11849,7 +11764,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
| 11849 | pci_disable_device(pdev); | 11764 | pci_disable_device(pdev); |
| 11850 | pci_set_drvdata(pdev, NULL); | 11765 | pci_set_drvdata(pdev, NULL); |
| 11851 | out_free_ieee80211: | 11766 | out_free_ieee80211: |
| 11852 | free_ieee80211(priv->net_dev, 0); | 11767 | free_ieee80211(priv->net_dev); |
| 11853 | out: | 11768 | out: |
| 11854 | return err; | 11769 | return err; |
| 11855 | } | 11770 | } |
| @@ -11916,7 +11831,7 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) | |||
| 11916 | pci_release_regions(pdev); | 11831 | pci_release_regions(pdev); |
| 11917 | pci_disable_device(pdev); | 11832 | pci_disable_device(pdev); |
| 11918 | pci_set_drvdata(pdev, NULL); | 11833 | pci_set_drvdata(pdev, NULL); |
| 11919 | free_ieee80211(priv->net_dev, 0); | 11834 | free_ieee80211(priv->net_dev); |
| 11920 | free_firmware(); | 11835 | free_firmware(); |
| 11921 | } | 11836 | } |
| 11922 | 11837 | ||
diff --git a/drivers/net/wireless/ipw2x00/libipw.h b/drivers/net/wireless/ipw2x00/libipw.h index bf45391172f3..1e334ff6bd52 100644 --- a/drivers/net/wireless/ipw2x00/libipw.h +++ b/drivers/net/wireless/ipw2x00/libipw.h | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <linux/ieee80211.h> | 31 | #include <linux/ieee80211.h> |
| 32 | 32 | ||
| 33 | #include <net/lib80211.h> | 33 | #include <net/lib80211.h> |
| 34 | #include <net/cfg80211.h> | ||
| 35 | 34 | ||
| 36 | #define LIBIPW_VERSION "git-1.1.13" | 35 | #define LIBIPW_VERSION "git-1.1.13" |
| 37 | 36 | ||
| @@ -784,15 +783,12 @@ struct libipw_geo { | |||
| 784 | 783 | ||
| 785 | struct libipw_device { | 784 | struct libipw_device { |
| 786 | struct net_device *dev; | 785 | struct net_device *dev; |
| 787 | struct wireless_dev wdev; | ||
| 788 | struct libipw_security sec; | 786 | struct libipw_security sec; |
| 789 | 787 | ||
| 790 | /* Bookkeeping structures */ | 788 | /* Bookkeeping structures */ |
| 791 | struct libipw_stats ieee_stats; | 789 | struct libipw_stats ieee_stats; |
| 792 | 790 | ||
| 793 | struct libipw_geo geo; | 791 | struct libipw_geo geo; |
| 794 | struct ieee80211_supported_band bg_band; | ||
| 795 | struct ieee80211_supported_band a_band; | ||
| 796 | 792 | ||
| 797 | /* Probe / Beacon management */ | 793 | /* Probe / Beacon management */ |
| 798 | struct list_head network_free_list; | 794 | struct list_head network_free_list; |
| @@ -1018,8 +1014,8 @@ static inline int libipw_is_cck_rate(u8 rate) | |||
| 1018 | } | 1014 | } |
| 1019 | 1015 | ||
| 1020 | /* ieee80211.c */ | 1016 | /* ieee80211.c */ |
| 1021 | extern void free_ieee80211(struct net_device *dev, int monitor); | 1017 | extern void free_ieee80211(struct net_device *dev); |
| 1022 | extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); | 1018 | extern struct net_device *alloc_ieee80211(int sizeof_priv); |
| 1023 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); | 1019 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); |
| 1024 | 1020 | ||
| 1025 | extern void libipw_networks_age(struct libipw_device *ieee, | 1021 | extern void libipw_networks_age(struct libipw_device *ieee, |
diff --git a/drivers/net/wireless/ipw2x00/libipw_module.c b/drivers/net/wireless/ipw2x00/libipw_module.c index a0e9f6aed7da..eb2b60834c17 100644 --- a/drivers/net/wireless/ipw2x00/libipw_module.c +++ b/drivers/net/wireless/ipw2x00/libipw_module.c | |||
| @@ -62,9 +62,6 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION); | |||
| 62 | MODULE_AUTHOR(DRV_COPYRIGHT); | 62 | MODULE_AUTHOR(DRV_COPYRIGHT); |
| 63 | MODULE_LICENSE("GPL"); | 63 | MODULE_LICENSE("GPL"); |
| 64 | 64 | ||
| 65 | struct cfg80211_ops libipw_config_ops = { }; | ||
| 66 | void *libipw_wiphy_privid = &libipw_wiphy_privid; | ||
| 67 | |||
| 68 | static int libipw_networks_allocate(struct libipw_device *ieee) | 65 | static int libipw_networks_allocate(struct libipw_device *ieee) |
| 69 | { | 66 | { |
| 70 | if (ieee->networks) | 67 | if (ieee->networks) |
| @@ -143,7 +140,7 @@ int libipw_change_mtu(struct net_device *dev, int new_mtu) | |||
| 143 | } | 140 | } |
| 144 | EXPORT_SYMBOL(libipw_change_mtu); | 141 | EXPORT_SYMBOL(libipw_change_mtu); |
| 145 | 142 | ||
| 146 | struct net_device *alloc_ieee80211(int sizeof_priv, int monitor) | 143 | struct net_device *alloc_ieee80211(int sizeof_priv) |
| 147 | { | 144 | { |
| 148 | struct libipw_device *ieee; | 145 | struct libipw_device *ieee; |
| 149 | struct net_device *dev; | 146 | struct net_device *dev; |
| @@ -160,31 +157,10 @@ struct net_device *alloc_ieee80211(int sizeof_priv, int monitor) | |||
| 160 | 157 | ||
| 161 | ieee->dev = dev; | 158 | ieee->dev = dev; |
| 162 | 159 | ||
| 163 | if (!monitor) { | ||
| 164 | ieee->wdev.wiphy = wiphy_new(&libipw_config_ops, 0); | ||
| 165 | if (!ieee->wdev.wiphy) { | ||
| 166 | LIBIPW_ERROR("Unable to allocate wiphy.\n"); | ||
| 167 | goto failed_free_netdev; | ||
| 168 | } | ||
| 169 | |||
| 170 | ieee->dev->ieee80211_ptr = &ieee->wdev; | ||
| 171 | ieee->wdev.iftype = NL80211_IFTYPE_STATION; | ||
| 172 | |||
| 173 | /* Fill-out wiphy structure bits we know... Not enough info | ||
| 174 | here to call set_wiphy_dev or set MAC address or channel info | ||
| 175 | -- have to do that in ->ndo_init... */ | ||
| 176 | ieee->wdev.wiphy->privid = libipw_wiphy_privid; | ||
| 177 | |||
| 178 | ieee->wdev.wiphy->max_scan_ssids = 1; | ||
| 179 | ieee->wdev.wiphy->max_scan_ie_len = 0; | ||
| 180 | ieee->wdev.wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | ||
| 181 | | BIT(NL80211_IFTYPE_ADHOC); | ||
| 182 | } | ||
| 183 | |||
| 184 | err = libipw_networks_allocate(ieee); | 160 | err = libipw_networks_allocate(ieee); |
| 185 | if (err) { | 161 | if (err) { |
| 186 | LIBIPW_ERROR("Unable to allocate beacon storage: %d\n", err); | 162 | LIBIPW_ERROR("Unable to allocate beacon storage: %d\n", err); |
| 187 | goto failed_free_wiphy; | 163 | goto failed_free_netdev; |
| 188 | } | 164 | } |
| 189 | libipw_networks_initialize(ieee); | 165 | libipw_networks_initialize(ieee); |
| 190 | 166 | ||
| @@ -217,31 +193,19 @@ struct net_device *alloc_ieee80211(int sizeof_priv, int monitor) | |||
| 217 | 193 | ||
| 218 | return dev; | 194 | return dev; |
| 219 | 195 | ||
| 220 | failed_free_wiphy: | ||
| 221 | if (!monitor) | ||
| 222 | wiphy_free(ieee->wdev.wiphy); | ||
| 223 | failed_free_netdev: | 196 | failed_free_netdev: |
| 224 | free_netdev(dev); | 197 | free_netdev(dev); |
| 225 | failed: | 198 | failed: |
| 226 | return NULL; | 199 | return NULL; |
| 227 | } | 200 | } |
| 228 | 201 | ||
| 229 | void free_ieee80211(struct net_device *dev, int monitor) | 202 | void free_ieee80211(struct net_device *dev) |
| 230 | { | 203 | { |
| 231 | struct libipw_device *ieee = netdev_priv(dev); | 204 | struct libipw_device *ieee = netdev_priv(dev); |
| 232 | 205 | ||
| 233 | lib80211_crypt_info_free(&ieee->crypt_info); | 206 | lib80211_crypt_info_free(&ieee->crypt_info); |
| 234 | 207 | ||
| 235 | libipw_networks_free(ieee); | 208 | libipw_networks_free(ieee); |
| 236 | |||
| 237 | /* free cfg80211 resources */ | ||
| 238 | if (!monitor) { | ||
| 239 | wiphy_unregister(ieee->wdev.wiphy); | ||
| 240 | kfree(ieee->a_band.channels); | ||
| 241 | kfree(ieee->bg_band.channels); | ||
| 242 | wiphy_free(ieee->wdev.wiphy); | ||
| 243 | } | ||
| 244 | |||
| 245 | free_netdev(dev); | 209 | free_netdev(dev); |
| 246 | } | 210 | } |
| 247 | 211 | ||
