diff options
Diffstat (limited to 'drivers/net/wireless/ipw2200.c')
-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 | } |