util.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. static void set_mandatory_flags_band(struct ieee80211_supported_band *sband,
  30. enum ieee80211_band band)
  31. {
  32. int i, want;
  33. switch (band) {
  34. case IEEE80211_BAND_5GHZ:
  35. want = 3;
  36. for (i = 0; i < sband->n_bitrates; i++) {
  37. if (sband->bitrates[i].bitrate == 60 ||
  38. sband->bitrates[i].bitrate == 120 ||
  39. sband->bitrates[i].bitrate == 240) {
  40. sband->bitrates[i].flags |=
  41. IEEE80211_RATE_MANDATORY_A;
  42. want--;
  43. }
  44. }
  45. WARN_ON(want);
  46. break;
  47. case IEEE80211_BAND_2GHZ:
  48. want = 7;
  49. for (i = 0; i < sband->n_bitrates; i++) {
  50. if (sband->bitrates[i].bitrate == 10) {
  51. sband->bitrates[i].flags |=
  52. IEEE80211_RATE_MANDATORY_B |
  53. IEEE80211_RATE_MANDATORY_G;
  54. want--;
  55. }
  56. if (sband->bitrates[i].bitrate == 20 ||
  57. sband->bitrates[i].bitrate == 55 ||
  58. sband->bitrates[i].bitrate == 110 ||
  59. sband->bitrates[i].bitrate == 60 ||
  60. sband->bitrates[i].bitrate == 120 ||
  61. sband->bitrates[i].bitrate == 240) {
  62. sband->bitrates[i].flags |=
  63. IEEE80211_RATE_MANDATORY_G;
  64. want--;
  65. }
  66. if (sband->bitrates[i].bitrate != 10 &&
  67. sband->bitrates[i].bitrate != 20 &&
  68. sband->bitrates[i].bitrate != 55 &&
  69. sband->bitrates[i].bitrate != 110)
  70. sband->bitrates[i].flags |=
  71. IEEE80211_RATE_ERP_G;
  72. }
  73. WARN_ON(want != 0 && want != 3 && want != 6);
  74. break;
  75. case IEEE80211_NUM_BANDS:
  76. WARN_ON(1);
  77. break;
  78. }
  79. }
  80. void ieee80211_set_bitrate_flags(struct wiphy *wiphy)
  81. {
  82. enum ieee80211_band band;
  83. for (band = 0; band < IEEE80211_NUM_BANDS; band++)
  84. if (wiphy->bands[band])
  85. set_mandatory_flags_band(wiphy->bands[band], band);
  86. }