diff options
Diffstat (limited to 'drivers/net/wireless/ipw2x00/ipw2200.c')
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 143 |
1 files changed, 28 insertions, 115 deletions
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 9b0f2c0646e0..a6ca536e44f8 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
| @@ -104,25 +104,6 @@ static int antenna = CFG_SYS_ANTENNA_BOTH; | |||
| 104 | static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ | 104 | static int rtap_iface = 0; /* def: 0 -- do not create rtap interface */ |
| 105 | #endif | 105 | #endif |
| 106 | 106 | ||
| 107 | static struct ieee80211_rate ipw2200_rates[] = { | ||
| 108 | { .bitrate = 10 }, | ||
| 109 | { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, | ||
| 110 | { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, | ||
| 111 | { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, | ||
| 112 | { .bitrate = 60 }, | ||
| 113 | { .bitrate = 90 }, | ||
| 114 | { .bitrate = 120 }, | ||
| 115 | { .bitrate = 180 }, | ||
| 116 | { .bitrate = 240 }, | ||
| 117 | { .bitrate = 360 }, | ||
| 118 | { .bitrate = 480 }, | ||
| 119 | { .bitrate = 540 } | ||
| 120 | }; | ||
| 121 | |||
| 122 | #define ipw2200_a_rates (ipw2200_rates + 4) | ||
| 123 | #define ipw2200_num_a_rates 8 | ||
| 124 | #define ipw2200_bg_rates (ipw2200_rates + 0) | ||
| 125 | #define ipw2200_num_bg_rates 12 | ||
| 126 | 107 | ||
| 127 | #ifdef CONFIG_IPW2200_QOS | 108 | #ifdef CONFIG_IPW2200_QOS |
| 128 | static int qos_enable = 0; | 109 | static int qos_enable = 0; |
| @@ -8674,6 +8655,24 @@ static int ipw_sw_reset(struct ipw_priv *priv, int option) | |||
| 8674 | * | 8655 | * |
| 8675 | */ | 8656 | */ |
| 8676 | 8657 | ||
| 8658 | static int ipw_wx_get_name(struct net_device *dev, | ||
| 8659 | struct iw_request_info *info, | ||
| 8660 | union iwreq_data *wrqu, char *extra) | ||
| 8661 | { | ||
| 8662 | struct ipw_priv *priv = libipw_priv(dev); | ||
| 8663 | mutex_lock(&priv->mutex); | ||
| 8664 | if (priv->status & STATUS_RF_KILL_MASK) | ||
| 8665 | strcpy(wrqu->name, "radio off"); | ||
| 8666 | else if (!(priv->status & STATUS_ASSOCIATED)) | ||
| 8667 | strcpy(wrqu->name, "unassociated"); | ||
| 8668 | else | ||
| 8669 | snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11%c", | ||
| 8670 | ipw_modes[priv->assoc_request.ieee_mode]); | ||
| 8671 | IPW_DEBUG_WX("Name: %s\n", wrqu->name); | ||
| 8672 | mutex_unlock(&priv->mutex); | ||
| 8673 | return 0; | ||
| 8674 | } | ||
| 8675 | |||
| 8677 | static int ipw_set_channel(struct ipw_priv *priv, u8 channel) | 8676 | static int ipw_set_channel(struct ipw_priv *priv, u8 channel) |
| 8678 | { | 8677 | { |
| 8679 | if (channel == 0) { | 8678 | if (channel == 0) { |
| @@ -9973,7 +9972,7 @@ static int ipw_wx_sw_reset(struct net_device *dev, | |||
| 9973 | /* Rebase the WE IOCTLs to zero for the handler array */ | 9972 | /* Rebase the WE IOCTLs to zero for the handler array */ |
| 9974 | #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] | 9973 | #define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] |
| 9975 | static iw_handler ipw_wx_handlers[] = { | 9974 | static iw_handler ipw_wx_handlers[] = { |
| 9976 | IW_IOCTL(SIOCGIWNAME) = (iw_handler) cfg80211_wext_giwname, | 9975 | IW_IOCTL(SIOCGIWNAME) = ipw_wx_get_name, |
| 9977 | IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq, | 9976 | IW_IOCTL(SIOCSIWFREQ) = ipw_wx_set_freq, |
| 9978 | IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, | 9977 | IW_IOCTL(SIOCGIWFREQ) = ipw_wx_get_freq, |
| 9979 | IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, | 9978 | IW_IOCTL(SIOCSIWMODE) = ipw_wx_set_mode, |
| @@ -11417,100 +11416,16 @@ static void ipw_bg_down(struct work_struct *work) | |||
| 11417 | /* Called by register_netdev() */ | 11416 | /* Called by register_netdev() */ |
| 11418 | static int ipw_net_init(struct net_device *dev) | 11417 | static int ipw_net_init(struct net_device *dev) |
| 11419 | { | 11418 | { |
| 11420 | int i, rc = 0; | ||
| 11421 | struct ipw_priv *priv = libipw_priv(dev); | 11419 | struct ipw_priv *priv = libipw_priv(dev); |
| 11422 | const struct libipw_geo *geo = libipw_get_geo(priv->ieee); | ||
| 11423 | struct wireless_dev *wdev = &priv->ieee->wdev; | ||
| 11424 | mutex_lock(&priv->mutex); | 11420 | mutex_lock(&priv->mutex); |
| 11425 | 11421 | ||
| 11426 | if (ipw_up(priv)) { | 11422 | if (ipw_up(priv)) { |
| 11427 | rc = -EIO; | 11423 | mutex_unlock(&priv->mutex); |
| 11428 | goto out; | 11424 | return -EIO; |
| 11429 | } | ||
| 11430 | |||
| 11431 | memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); | ||
| 11432 | |||
| 11433 | /* fill-out priv->ieee->bg_band */ | ||
| 11434 | if (geo->bg_channels) { | ||
| 11435 | struct ieee80211_supported_band *bg_band = &priv->ieee->bg_band; | ||
| 11436 | |||
| 11437 | bg_band->band = IEEE80211_BAND_2GHZ; | ||
| 11438 | bg_band->n_channels = geo->bg_channels; | ||
| 11439 | bg_band->channels = | ||
| 11440 | kzalloc(geo->bg_channels * | ||
| 11441 | sizeof(struct ieee80211_channel), GFP_KERNEL); | ||
| 11442 | /* translate geo->bg to bg_band.channels */ | ||
| 11443 | for (i = 0; i < geo->bg_channels; i++) { | ||
| 11444 | bg_band->channels[i].band = IEEE80211_BAND_2GHZ; | ||
| 11445 | bg_band->channels[i].center_freq = geo->bg[i].freq; | ||
| 11446 | bg_band->channels[i].hw_value = geo->bg[i].channel; | ||
| 11447 | bg_band->channels[i].max_power = geo->bg[i].max_power; | ||
| 11448 | if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY) | ||
| 11449 | bg_band->channels[i].flags |= | ||
| 11450 | IEEE80211_CHAN_PASSIVE_SCAN; | ||
| 11451 | if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS) | ||
| 11452 | bg_band->channels[i].flags |= | ||
| 11453 | IEEE80211_CHAN_NO_IBSS; | ||
| 11454 | if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT) | ||
| 11455 | bg_band->channels[i].flags |= | ||
| 11456 | IEEE80211_CHAN_RADAR; | ||
| 11457 | /* No equivalent for LIBIPW_CH_80211H_RULES, | ||
| 11458 | LIBIPW_CH_UNIFORM_SPREADING, or | ||
| 11459 | LIBIPW_CH_B_ONLY... */ | ||
| 11460 | } | ||
| 11461 | /* point at bitrate info */ | ||
| 11462 | bg_band->bitrates = ipw2200_bg_rates; | ||
| 11463 | bg_band->n_bitrates = ipw2200_num_bg_rates; | ||
| 11464 | |||
| 11465 | wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = bg_band; | ||
| 11466 | } | ||
| 11467 | |||
| 11468 | /* fill-out priv->ieee->a_band */ | ||
| 11469 | if (geo->a_channels) { | ||
| 11470 | struct ieee80211_supported_band *a_band = &priv->ieee->a_band; | ||
| 11471 | |||
| 11472 | a_band->band = IEEE80211_BAND_5GHZ; | ||
| 11473 | a_band->n_channels = geo->a_channels; | ||
| 11474 | a_band->channels = | ||
| 11475 | kzalloc(geo->a_channels * | ||
| 11476 | sizeof(struct ieee80211_channel), GFP_KERNEL); | ||
| 11477 | /* translate geo->bg to a_band.channels */ | ||
| 11478 | for (i = 0; i < geo->a_channels; i++) { | ||
| 11479 | a_band->channels[i].band = IEEE80211_BAND_2GHZ; | ||
| 11480 | a_band->channels[i].center_freq = geo->a[i].freq; | ||
| 11481 | a_band->channels[i].hw_value = geo->a[i].channel; | ||
| 11482 | a_band->channels[i].max_power = geo->a[i].max_power; | ||
| 11483 | if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY) | ||
| 11484 | a_band->channels[i].flags |= | ||
| 11485 | IEEE80211_CHAN_PASSIVE_SCAN; | ||
| 11486 | if (geo->a[i].flags & LIBIPW_CH_NO_IBSS) | ||
| 11487 | a_band->channels[i].flags |= | ||
| 11488 | IEEE80211_CHAN_NO_IBSS; | ||
| 11489 | if (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT) | ||
| 11490 | a_band->channels[i].flags |= | ||
| 11491 | IEEE80211_CHAN_RADAR; | ||
| 11492 | /* No equivalent for LIBIPW_CH_80211H_RULES, | ||
| 11493 | LIBIPW_CH_UNIFORM_SPREADING, or | ||
| 11494 | LIBIPW_CH_B_ONLY... */ | ||
| 11495 | } | ||
| 11496 | /* point at bitrate info */ | ||
| 11497 | a_band->bitrates = ipw2200_a_rates; | ||
| 11498 | a_band->n_bitrates = ipw2200_num_a_rates; | ||
| 11499 | |||
| 11500 | wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = a_band; | ||
| 11501 | } | ||
| 11502 | |||
| 11503 | set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); | ||
| 11504 | |||
| 11505 | /* With that information in place, we can now register the wiphy... */ | ||
| 11506 | if (wiphy_register(wdev->wiphy)) { | ||
| 11507 | rc = -EIO; | ||
| 11508 | goto out; | ||
| 11509 | } | 11425 | } |
| 11510 | 11426 | ||
| 11511 | out: | ||
| 11512 | mutex_unlock(&priv->mutex); | 11427 | mutex_unlock(&priv->mutex); |
| 11513 | return rc; | 11428 | return 0; |
| 11514 | } | 11429 | } |
| 11515 | 11430 | ||
| 11516 | /* PCI driver stuff */ | 11431 | /* PCI driver stuff */ |
| @@ -11641,7 +11556,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv) | |||
| 11641 | if (priv->prom_net_dev) | 11556 | if (priv->prom_net_dev) |
| 11642 | return -EPERM; | 11557 | return -EPERM; |
| 11643 | 11558 | ||
| 11644 | priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv), 1); | 11559 | priv->prom_net_dev = alloc_ieee80211(sizeof(struct ipw_prom_priv)); |
| 11645 | if (priv->prom_net_dev == NULL) | 11560 | if (priv->prom_net_dev == NULL) |
| 11646 | return -ENOMEM; | 11561 | return -ENOMEM; |
| 11647 | 11562 | ||
| @@ -11660,7 +11575,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv) | |||
| 11660 | 11575 | ||
| 11661 | rc = register_netdev(priv->prom_net_dev); | 11576 | rc = register_netdev(priv->prom_net_dev); |
| 11662 | if (rc) { | 11577 | if (rc) { |
| 11663 | free_ieee80211(priv->prom_net_dev, 1); | 11578 | free_ieee80211(priv->prom_net_dev); |
| 11664 | priv->prom_net_dev = NULL; | 11579 | priv->prom_net_dev = NULL; |
| 11665 | return rc; | 11580 | return rc; |
| 11666 | } | 11581 | } |
| @@ -11674,7 +11589,7 @@ static void ipw_prom_free(struct ipw_priv *priv) | |||
| 11674 | return; | 11589 | return; |
| 11675 | 11590 | ||
| 11676 | unregister_netdev(priv->prom_net_dev); | 11591 | unregister_netdev(priv->prom_net_dev); |
| 11677 | free_ieee80211(priv->prom_net_dev, 1); | 11592 | free_ieee80211(priv->prom_net_dev); |
| 11678 | 11593 | ||
| 11679 | priv->prom_net_dev = NULL; | 11594 | priv->prom_net_dev = NULL; |
| 11680 | } | 11595 | } |
| @@ -11702,7 +11617,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
| 11702 | struct ipw_priv *priv; | 11617 | struct ipw_priv *priv; |
| 11703 | int i; | 11618 | int i; |
| 11704 | 11619 | ||
| 11705 | net_dev = alloc_ieee80211(sizeof(struct ipw_priv), 0); | 11620 | net_dev = alloc_ieee80211(sizeof(struct ipw_priv)); |
| 11706 | if (net_dev == NULL) { | 11621 | if (net_dev == NULL) { |
| 11707 | err = -ENOMEM; | 11622 | err = -ENOMEM; |
| 11708 | goto out; | 11623 | goto out; |
| @@ -11822,7 +11737,6 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
| 11822 | if (err) { | 11737 | if (err) { |
| 11823 | IPW_ERROR("Failed to register promiscuous network " | 11738 | IPW_ERROR("Failed to register promiscuous network " |
| 11824 | "device (error %d).\n", err); | 11739 | "device (error %d).\n", err); |
| 11825 | unregister_ieee80211(priv->ieee); | ||
| 11826 | unregister_netdev(priv->net_dev); | 11740 | unregister_netdev(priv->net_dev); |
| 11827 | goto out_remove_sysfs; | 11741 | goto out_remove_sysfs; |
| 11828 | } | 11742 | } |
| @@ -11851,7 +11765,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
| 11851 | pci_disable_device(pdev); | 11765 | pci_disable_device(pdev); |
| 11852 | pci_set_drvdata(pdev, NULL); | 11766 | pci_set_drvdata(pdev, NULL); |
| 11853 | out_free_ieee80211: | 11767 | out_free_ieee80211: |
| 11854 | free_ieee80211(priv->net_dev, 0); | 11768 | free_ieee80211(priv->net_dev); |
| 11855 | out: | 11769 | out: |
| 11856 | return err; | 11770 | return err; |
| 11857 | } | 11771 | } |
| @@ -11873,7 +11787,6 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) | |||
| 11873 | 11787 | ||
| 11874 | mutex_unlock(&priv->mutex); | 11788 | mutex_unlock(&priv->mutex); |
| 11875 | 11789 | ||
| 11876 | unregister_ieee80211(priv->ieee); | ||
| 11877 | unregister_netdev(priv->net_dev); | 11790 | unregister_netdev(priv->net_dev); |
| 11878 | 11791 | ||
| 11879 | if (priv->rxq) { | 11792 | if (priv->rxq) { |
| @@ -11919,7 +11832,7 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) | |||
| 11919 | pci_release_regions(pdev); | 11832 | pci_release_regions(pdev); |
| 11920 | pci_disable_device(pdev); | 11833 | pci_disable_device(pdev); |
| 11921 | pci_set_drvdata(pdev, NULL); | 11834 | pci_set_drvdata(pdev, NULL); |
| 11922 | free_ieee80211(priv->net_dev, 0); | 11835 | free_ieee80211(priv->net_dev); |
| 11923 | free_firmware(); | 11836 | free_firmware(); |
| 11924 | } | 11837 | } |
| 11925 | 11838 | ||
