diff options
author | Luis R. Rodriguez <lrodriguez@atheros.com> | 2009-01-07 20:43:37 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-16 17:08:24 -0500 |
commit | 02e68a3da0fbdb178cdec54b7db48edeefd1691d (patch) | |
tree | 556573da26818fbfb7edac0f1ccc989fe6674611 /net/wireless/reg.c | |
parent | 0c7dc45d21de6ae212b5ccb7cdff5beff795ccf0 (diff) |
cfg80211: Fix parsed country IE info for 5 GHz
The country IE number of channels on 5 GHz specifies the number
of 5 GHz channels, not the number of sequential channel numbers.
For example, if in a country IEs if the first channel given is 36
and the number of channels passed is 4 then the individual channel
numbers defined for the 5 GHz PHY by these parameters
are: 36, 40, 44, 48
not: 36, 37, 38, 39
See: http://tinyurl.com/11d-clarification
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r-- | net/wireless/reg.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 5f6d20d98eeb..bc494cef2102 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -563,6 +563,7 @@ static struct ieee80211_regdomain *country_ie_2_rd( | |||
563 | 563 | ||
564 | /* This time around we fill in the rd */ | 564 | /* This time around we fill in the rd */ |
565 | while (country_ie_len >= 3) { | 565 | while (country_ie_len >= 3) { |
566 | int end_channel = 0; | ||
566 | struct ieee80211_country_ie_triplet *triplet = | 567 | struct ieee80211_country_ie_triplet *triplet = |
567 | (struct ieee80211_country_ie_triplet *) country_ie; | 568 | (struct ieee80211_country_ie_triplet *) country_ie; |
568 | struct ieee80211_reg_rule *reg_rule = NULL; | 569 | struct ieee80211_reg_rule *reg_rule = NULL; |
@@ -584,6 +585,23 @@ static struct ieee80211_regdomain *country_ie_2_rd( | |||
584 | 585 | ||
585 | reg_rule->flags = flags; | 586 | reg_rule->flags = flags; |
586 | 587 | ||
588 | /* 2 GHz */ | ||
589 | if (triplet->chans.first_channel <= 14) | ||
590 | end_channel = triplet->chans.first_channel + | ||
591 | triplet->chans.num_channels; | ||
592 | else | ||
593 | /* | ||
594 | * 5 GHz -- For example in country IEs if the first | ||
595 | * channel given is 36 and the number of channels is 4 | ||
596 | * then the individual channel numbers defined for the | ||
597 | * 5 GHz PHY by these parameters are: 36, 40, 44, and 48 | ||
598 | * and not 36, 37, 38, 39. | ||
599 | * | ||
600 | * See: http://tinyurl.com/11d-clarification | ||
601 | */ | ||
602 | end_channel = triplet->chans.first_channel + | ||
603 | (4 * (triplet->chans.num_channels - 1)); | ||
604 | |||
587 | /* The +10 is since the regulatory domain expects | 605 | /* The +10 is since the regulatory domain expects |
588 | * the actual band edge, not the center of freq for | 606 | * the actual band edge, not the center of freq for |
589 | * its start and end freqs, assuming 20 MHz bandwidth on | 607 | * its start and end freqs, assuming 20 MHz bandwidth on |
@@ -593,8 +611,7 @@ static struct ieee80211_regdomain *country_ie_2_rd( | |||
593 | triplet->chans.first_channel) - 10); | 611 | triplet->chans.first_channel) - 10); |
594 | freq_range->end_freq_khz = | 612 | freq_range->end_freq_khz = |
595 | MHZ_TO_KHZ(ieee80211_channel_to_frequency( | 613 | MHZ_TO_KHZ(ieee80211_channel_to_frequency( |
596 | triplet->chans.first_channel + | 614 | end_channel) + 10); |
597 | triplet->chans.num_channels) + 10); | ||
598 | 615 | ||
599 | /* Large arbitrary values, we intersect later */ | 616 | /* Large arbitrary values, we intersect later */ |
600 | /* Increment this if we ever support >= 40 MHz channels | 617 | /* Increment this if we ever support >= 40 MHz channels |