util.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Wireless utility functions
  3. *
  4. * Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
  5. */
  6. #include <net/wireless.h>
  7. #include <asm/bitops.h>
  8. #include "core.h"
  9. int ieee80211_channel_to_frequency(int chan)
  10. {
  11. if (chan < 14)
  12. return 2407 + chan * 5;
  13. if (chan == 14)
  14. return 2484;
  15. /* FIXME: 802.11j 17.3.8.3.2 */
  16. return (chan + 1000) * 5;
  17. }
  18. EXPORT_SYMBOL(ieee80211_channel_to_frequency);
  19. int ieee80211_frequency_to_channel(int freq)
  20. {
  21. if (freq == 2484)
  22. return 14;
  23. if (freq < 2484)
  24. return (freq - 2407) / 5;
  25. /* FIXME: 802.11j 17.3.8.3.2 */
  26. return freq/5 - 1000;
  27. }
  28. EXPORT_SYMBOL(ieee80211_frequency_to_channel);
  29. struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
  30. int freq)
  31. {
  32. enum ieee80211_band band;
  33. struct ieee80211_supported_band *sband;
  34. int i;
  35. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  36. sband = wiphy->bands[band];
  37. if (!sband)
  38. continue;
  39. for (i = 0; i < sband->n_channels; i++) {
  40. if (sband->channels[i].center_freq == freq)
  41. return &sband->channels[i];
  42. }
  43. }
  44. return NULL;
  45. }
  46. EXPORT_SYMBOL(__ieee80211_get_channel);
  47. static void set_mandatory_flags_band(struct ieee80211_supported_band *sband,
  48. enum ieee80211_band band)
  49. {
  50. int i, want;
  51. switch (band) {
  52. case IEEE80211_BAND_5GHZ:
  53. want = 3;
  54. for (i = 0; i < sband->n_bitrates; i++) {
  55. if (sband->bitrates[i].bitrate == 60 ||
  56. sband->bitrates[i].bitrate == 120 ||
  57. sband->bitrates[i].bitrate == 240) {
  58. sband->bitrates[i].flags |=
  59. IEEE80211_RATE_MANDATORY_A;
  60. want--;
  61. }
  62. }
  63. WARN_ON(want);
  64. break;
  65. case IEEE80211_BAND_2GHZ:
  66. want = 7;
  67. for (i = 0; i < sband->n_bitrates; i++) {
  68. if (sband->bitrates[i].bitrate == 10) {
  69. sband->bitrates[i].flags |=
  70. IEEE80211_RATE_MANDATORY_B |
  71. IEEE80211_RATE_MANDATORY_G;
  72. want--;
  73. }
  74. if (sband->bitrates[i].bitrate == 20 ||
  75. sband->bitrates[i].bitrate == 55 ||
  76. sband->bitrates[i].bitrate == 110 ||
  77. sband->bitrates[i].bitrate == 60 ||
  78. sband->bitrates[i].bitrate == 120 ||
  79. sband->bitrates[i].bitrate == 240) {
  80. sband->bitrates[i].flags |=
  81. IEEE80211_RATE_MANDATORY_G;
  82. want--;
  83. }
  84. if (sband->bitrates[i].bitrate != 10 &&
  85. sband->bitrates[i].bitrate != 20 &&
  86. sband->bitrates[i].bitrate != 55 &&
  87. sband->bitrates[i].bitrate != 110)
  88. sband->bitrates[i].flags |=
  89. IEEE80211_RATE_ERP_G;
  90. }
  91. WARN_ON(want != 0 && want != 3 && want != 6);
  92. break;
  93. case IEEE80211_NUM_BANDS:
  94. WARN_ON(1);
  95. break;
  96. }
  97. }
  98. void ieee80211_set_bitrate_flags(struct wiphy *wiphy)
  99. {
  100. enum ieee80211_band band;
  101. for (band = 0; band < IEEE80211_NUM_BANDS; band++)
  102. if (wiphy->bands[band])
  103. set_mandatory_flags_band(wiphy->bands[band], band);
  104. }