diff options
| -rw-r--r-- | drivers/net/wireless/ipw2200.c | 128 |
1 files changed, 16 insertions, 112 deletions
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index ed37141319ea..77932cf85008 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
| @@ -153,12 +153,6 @@ static int init_supported_rates(struct ipw_priv *priv, | |||
| 153 | static void ipw_set_hwcrypto_keys(struct ipw_priv *); | 153 | static void ipw_set_hwcrypto_keys(struct ipw_priv *); |
| 154 | static void ipw_send_wep_keys(struct ipw_priv *, int); | 154 | static void ipw_send_wep_keys(struct ipw_priv *, int); |
| 155 | 155 | ||
| 156 | static int ipw_is_valid_channel(struct ieee80211_device *, u8); | ||
| 157 | static int ipw_channel_to_index(struct ieee80211_device *, u8); | ||
| 158 | static u8 ipw_freq_to_channel(struct ieee80211_device *, u32); | ||
| 159 | static int ipw_set_geo(struct ieee80211_device *, const struct ieee80211_geo *); | ||
| 160 | static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *); | ||
| 161 | |||
| 162 | static int snprint_line(char *buf, size_t count, | 156 | static int snprint_line(char *buf, size_t count, |
| 163 | const u8 * data, u32 len, u32 ofs) | 157 | const u8 * data, u32 len, u32 ofs) |
| 164 | { | 158 | { |
| @@ -1654,7 +1648,7 @@ static ssize_t store_speed_scan(struct device *d, struct device_attribute *attr, | |||
| 1654 | break; | 1648 | break; |
| 1655 | } | 1649 | } |
| 1656 | 1650 | ||
| 1657 | if (ipw_is_valid_channel(priv->ieee, channel)) | 1651 | if (ieee80211_is_valid_channel(priv->ieee, channel)) |
| 1658 | priv->speed_scan[pos++] = channel; | 1652 | priv->speed_scan[pos++] = channel; |
| 1659 | else | 1653 | else |
| 1660 | IPW_WARNING("Skipping invalid channel request: %d\n", | 1654 | IPW_WARNING("Skipping invalid channel request: %d\n", |
| @@ -2222,7 +2216,7 @@ static int ipw_send_tx_power(struct ipw_priv *priv, struct ipw_tx_power *power) | |||
| 2222 | 2216 | ||
| 2223 | static int ipw_set_tx_power(struct ipw_priv *priv) | 2217 | static int ipw_set_tx_power(struct ipw_priv *priv) |
| 2224 | { | 2218 | { |
| 2225 | const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); | 2219 | const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); |
| 2226 | struct ipw_tx_power tx_power; | 2220 | struct ipw_tx_power tx_power; |
| 2227 | s8 max_power; | 2221 | s8 max_power; |
| 2228 | int i; | 2222 | int i; |
| @@ -5562,7 +5556,7 @@ static int ipw_best_network(struct ipw_priv *priv, | |||
| 5562 | } | 5556 | } |
| 5563 | 5557 | ||
| 5564 | /* Filter out invalid channel in current GEO */ | 5558 | /* Filter out invalid channel in current GEO */ |
| 5565 | if (!ipw_is_valid_channel(priv->ieee, network->channel)) { | 5559 | if (!ieee80211_is_valid_channel(priv->ieee, network->channel)) { |
| 5566 | IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " | 5560 | IPW_DEBUG_ASSOC("Network '%s (" MAC_FMT ")' excluded " |
| 5567 | "because of invalid channel in current GEO\n", | 5561 | "because of invalid channel in current GEO\n", |
| 5568 | escape_essid(network->ssid, network->ssid_len), | 5562 | escape_essid(network->ssid, network->ssid_len), |
| @@ -5607,7 +5601,7 @@ static int ipw_best_network(struct ipw_priv *priv, | |||
| 5607 | static void ipw_adhoc_create(struct ipw_priv *priv, | 5601 | static void ipw_adhoc_create(struct ipw_priv *priv, |
| 5608 | struct ieee80211_network *network) | 5602 | struct ieee80211_network *network) |
| 5609 | { | 5603 | { |
| 5610 | const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); | 5604 | const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); |
| 5611 | int i; | 5605 | int i; |
| 5612 | 5606 | ||
| 5613 | /* | 5607 | /* |
| @@ -5622,10 +5616,10 @@ static void ipw_adhoc_create(struct ipw_priv *priv, | |||
| 5622 | * FW fatal error. | 5616 | * FW fatal error. |
| 5623 | * | 5617 | * |
| 5624 | */ | 5618 | */ |
| 5625 | switch (ipw_is_valid_channel(priv->ieee, priv->channel)) { | 5619 | switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { |
| 5626 | case IEEE80211_52GHZ_BAND: | 5620 | case IEEE80211_52GHZ_BAND: |
| 5627 | network->mode = IEEE_A; | 5621 | network->mode = IEEE_A; |
| 5628 | i = ipw_channel_to_index(priv->ieee, priv->channel); | 5622 | i = ieee80211_channel_to_index(priv->ieee, priv->channel); |
| 5629 | if (i == -1) | 5623 | if (i == -1) |
| 5630 | BUG(); | 5624 | BUG(); |
| 5631 | if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) { | 5625 | if (geo->a[i].flags & IEEE80211_CH_PASSIVE_ONLY) { |
| @@ -5639,7 +5633,7 @@ static void ipw_adhoc_create(struct ipw_priv *priv, | |||
| 5639 | network->mode = IEEE_G; | 5633 | network->mode = IEEE_G; |
| 5640 | else | 5634 | else |
| 5641 | network->mode = IEEE_B; | 5635 | network->mode = IEEE_B; |
| 5642 | i = ipw_channel_to_index(priv->ieee, priv->channel); | 5636 | i = ieee80211_channel_to_index(priv->ieee, priv->channel); |
| 5643 | if (i == -1) | 5637 | if (i == -1) |
| 5644 | BUG(); | 5638 | BUG(); |
| 5645 | if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) { | 5639 | if (geo->bg[i].flags & IEEE80211_CH_PASSIVE_ONLY) { |
| @@ -5963,7 +5957,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | |||
| 5963 | const struct ieee80211_geo *geo; | 5957 | const struct ieee80211_geo *geo; |
| 5964 | int i; | 5958 | int i; |
| 5965 | 5959 | ||
| 5966 | geo = ipw_get_geo(priv->ieee); | 5960 | geo = ieee80211_get_geo(priv->ieee); |
| 5967 | 5961 | ||
| 5968 | if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) { | 5962 | if (priv->ieee->freq_band & IEEE80211_52GHZ_BAND) { |
| 5969 | int start = channel_index; | 5963 | int start = channel_index; |
| @@ -6023,7 +6017,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | |||
| 6023 | channel_index++; | 6017 | channel_index++; |
| 6024 | scan->channels_list[channel_index] = channel; | 6018 | scan->channels_list[channel_index] = channel; |
| 6025 | index = | 6019 | index = |
| 6026 | ipw_channel_to_index(priv->ieee, channel); | 6020 | ieee80211_channel_to_index(priv->ieee, channel); |
| 6027 | ipw_set_scan_type(scan, channel_index, | 6021 | ipw_set_scan_type(scan, channel_index, |
| 6028 | geo->bg[index]. | 6022 | geo->bg[index]. |
| 6029 | flags & | 6023 | flags & |
| @@ -6105,7 +6099,7 @@ static int ipw_request_scan(struct ipw_priv *priv) | |||
| 6105 | u8 channel; | 6099 | u8 channel; |
| 6106 | u8 band = 0; | 6100 | u8 band = 0; |
| 6107 | 6101 | ||
| 6108 | switch (ipw_is_valid_channel(priv->ieee, priv->channel)) { | 6102 | switch (ieee80211_is_valid_channel(priv->ieee, priv->channel)) { |
| 6109 | case IEEE80211_52GHZ_BAND: | 6103 | case IEEE80211_52GHZ_BAND: |
| 6110 | band = (u8) (IPW_A_MODE << 6) | 1; | 6104 | band = (u8) (IPW_A_MODE << 6) | 1; |
| 6111 | channel = priv->channel; | 6105 | channel = priv->channel; |
| @@ -8200,7 +8194,7 @@ static int ipw_wx_set_freq(struct net_device *dev, | |||
| 8200 | union iwreq_data *wrqu, char *extra) | 8194 | union iwreq_data *wrqu, char *extra) |
| 8201 | { | 8195 | { |
| 8202 | struct ipw_priv *priv = ieee80211_priv(dev); | 8196 | struct ipw_priv *priv = ieee80211_priv(dev); |
| 8203 | const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); | 8197 | const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); |
| 8204 | struct iw_freq *fwrq = &wrqu->freq; | 8198 | struct iw_freq *fwrq = &wrqu->freq; |
| 8205 | int ret = 0, i; | 8199 | int ret = 0, i; |
| 8206 | u8 channel, flags; | 8200 | u8 channel, flags; |
| @@ -8215,17 +8209,17 @@ static int ipw_wx_set_freq(struct net_device *dev, | |||
| 8215 | } | 8209 | } |
| 8216 | /* if setting by freq convert to channel */ | 8210 | /* if setting by freq convert to channel */ |
| 8217 | if (fwrq->e == 1) { | 8211 | if (fwrq->e == 1) { |
| 8218 | channel = ipw_freq_to_channel(priv->ieee, fwrq->m); | 8212 | channel = ieee80211_freq_to_channel(priv->ieee, fwrq->m); |
| 8219 | if (channel == 0) | 8213 | if (channel == 0) |
| 8220 | return -EINVAL; | 8214 | return -EINVAL; |
| 8221 | } else | 8215 | } else |
| 8222 | channel = fwrq->m; | 8216 | channel = fwrq->m; |
| 8223 | 8217 | ||
| 8224 | if (!(band = ipw_is_valid_channel(priv->ieee, channel))) | 8218 | if (!(band = ieee80211_is_valid_channel(priv->ieee, channel))) |
| 8225 | return -EINVAL; | 8219 | return -EINVAL; |
| 8226 | 8220 | ||
| 8227 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) { | 8221 | if (priv->ieee->iw_mode == IW_MODE_ADHOC) { |
| 8228 | i = ipw_channel_to_index(priv->ieee, channel); | 8222 | i = ieee80211_channel_to_index(priv->ieee, channel); |
| 8229 | if (i == -1) | 8223 | if (i == -1) |
| 8230 | return -EINVAL; | 8224 | return -EINVAL; |
| 8231 | 8225 | ||
| @@ -8353,7 +8347,7 @@ static int ipw_wx_get_range(struct net_device *dev, | |||
| 8353 | { | 8347 | { |
| 8354 | struct ipw_priv *priv = ieee80211_priv(dev); | 8348 | struct ipw_priv *priv = ieee80211_priv(dev); |
| 8355 | struct iw_range *range = (struct iw_range *)extra; | 8349 | struct iw_range *range = (struct iw_range *)extra; |
| 8356 | const struct ieee80211_geo *geo = ipw_get_geo(priv->ieee); | 8350 | const struct ieee80211_geo *geo = ieee80211_get_geo(priv->ieee); |
| 8357 | int i = 0, j; | 8351 | int i = 0, j; |
| 8358 | 8352 | ||
| 8359 | wrqu->data.length = sizeof(*range); | 8353 | wrqu->data.length = sizeof(*range); |
| @@ -10617,96 +10611,6 @@ static const struct ieee80211_geo ipw_geos[] = { | |||
| 10617 | } | 10611 | } |
| 10618 | }; | 10612 | }; |
| 10619 | 10613 | ||
| 10620 | /* GEO code borrowed from ieee80211_geo.c */ | ||
| 10621 | static int ipw_is_valid_channel(struct ieee80211_device *ieee, u8 channel) | ||
| 10622 | { | ||
| 10623 | int i; | ||
| 10624 | |||
| 10625 | /* Driver needs to initialize the geography map before using | ||
| 10626 | * these helper functions */ | ||
| 10627 | BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0); | ||
| 10628 | |||
| 10629 | if (ieee->freq_band & IEEE80211_24GHZ_BAND) | ||
| 10630 | for (i = 0; i < ieee->geo.bg_channels; i++) | ||
| 10631 | /* NOTE: If G mode is currently supported but | ||
| 10632 | * this is a B only channel, we don't see it | ||
| 10633 | * as valid. */ | ||
| 10634 | if ((ieee->geo.bg[i].channel == channel) && | ||
| 10635 | (!(ieee->mode & IEEE_G) || | ||
| 10636 | !(ieee->geo.bg[i].flags & IEEE80211_CH_B_ONLY))) | ||
| 10637 | return IEEE80211_24GHZ_BAND; | ||
| 10638 | |||
| 10639 | if (ieee->freq_band & IEEE80211_52GHZ_BAND) | ||
| 10640 | for (i = 0; i < ieee->geo.a_channels; i++) | ||
| 10641 | if (ieee->geo.a[i].channel == channel) | ||
| 10642 | return IEEE80211_52GHZ_BAND; | ||
| 10643 | |||
| 10644 | return 0; | ||
| 10645 | } | ||
| 10646 | |||
| 10647 | static int ipw_channel_to_index(struct ieee80211_device *ieee, u8 channel) | ||
| 10648 | { | ||
| 10649 | int i; | ||
| 10650 | |||
| 10651 | /* Driver needs to initialize the geography map before using | ||
| 10652 | * these helper functions */ | ||
| 10653 | BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0); | ||
| 10654 | |||
| 10655 | if (ieee->freq_band & IEEE80211_24GHZ_BAND) | ||
| 10656 | for (i = 0; i < ieee->geo.bg_channels; i++) | ||
| 10657 | if (ieee->geo.bg[i].channel == channel) | ||
| 10658 | return i; | ||
| 10659 | |||
| 10660 | if (ieee->freq_band & IEEE80211_52GHZ_BAND) | ||
| 10661 | for (i = 0; i < ieee->geo.a_channels; i++) | ||
| 10662 | if (ieee->geo.a[i].channel == channel) | ||
| 10663 | return i; | ||
| 10664 | |||
| 10665 | return -1; | ||
| 10666 | } | ||
| 10667 | |||
| 10668 | static u8 ipw_freq_to_channel(struct ieee80211_device *ieee, u32 freq) | ||
| 10669 | { | ||
| 10670 | int i; | ||
| 10671 | |||
| 10672 | /* Driver needs to initialize the geography map before using | ||
| 10673 | * these helper functions */ | ||
| 10674 | BUG_ON(ieee->geo.bg_channels == 0 && ieee->geo.a_channels == 0); | ||
| 10675 | |||
| 10676 | freq /= 100000; | ||
| 10677 | |||
| 10678 | if (ieee->freq_band & IEEE80211_24GHZ_BAND) | ||
| 10679 | for (i = 0; i < ieee->geo.bg_channels; i++) | ||
| 10680 | if (ieee->geo.bg[i].freq == freq) | ||
| 10681 | return ieee->geo.bg[i].channel; | ||
| 10682 | |||
| 10683 | if (ieee->freq_band & IEEE80211_52GHZ_BAND) | ||
| 10684 | for (i = 0; i < ieee->geo.a_channels; i++) | ||
| 10685 | if (ieee->geo.a[i].freq == freq) | ||
| 10686 | return ieee->geo.a[i].channel; | ||
| 10687 | |||
| 10688 | return 0; | ||
| 10689 | } | ||
| 10690 | |||
| 10691 | static int ipw_set_geo(struct ieee80211_device *ieee, | ||
| 10692 | const struct ieee80211_geo *geo) | ||
| 10693 | { | ||
| 10694 | memcpy(ieee->geo.name, geo->name, 3); | ||
| 10695 | ieee->geo.name[3] = '\0'; | ||
| 10696 | ieee->geo.bg_channels = geo->bg_channels; | ||
| 10697 | ieee->geo.a_channels = geo->a_channels; | ||
| 10698 | memcpy(ieee->geo.bg, geo->bg, geo->bg_channels * | ||
| 10699 | sizeof(struct ieee80211_channel)); | ||
| 10700 | memcpy(ieee->geo.a, geo->a, ieee->geo.a_channels * | ||
| 10701 | sizeof(struct ieee80211_channel)); | ||
| 10702 | return 0; | ||
| 10703 | } | ||
| 10704 | |||
| 10705 | static const struct ieee80211_geo *ipw_get_geo(struct ieee80211_device *ieee) | ||
| 10706 | { | ||
| 10707 | return &ieee->geo; | ||
| 10708 | } | ||
| 10709 | |||
| 10710 | #define MAX_HW_RESTARTS 5 | 10614 | #define MAX_HW_RESTARTS 5 |
| 10711 | static int ipw_up(struct ipw_priv *priv) | 10615 | static int ipw_up(struct ipw_priv *priv) |
| 10712 | { | 10616 | { |
| @@ -10753,7 +10657,7 @@ static int ipw_up(struct ipw_priv *priv) | |||
| 10753 | priv->eeprom[EEPROM_COUNTRY_CODE + 2]); | 10657 | priv->eeprom[EEPROM_COUNTRY_CODE + 2]); |
| 10754 | j = 0; | 10658 | j = 0; |
| 10755 | } | 10659 | } |
| 10756 | if (ipw_set_geo(priv->ieee, &ipw_geos[j])) { | 10660 | if (ieee80211_set_geo(priv->ieee, &ipw_geos[j])) { |
| 10757 | IPW_WARNING("Could not set geography."); | 10661 | IPW_WARNING("Could not set geography."); |
| 10758 | return 0; | 10662 | return 0; |
| 10759 | } | 10663 | } |
