iwl-3945-rs.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. * The full GNU General Public License is included in this distribution in the
  19. * file called LICENSE.
  20. *
  21. * Contact Information:
  22. * James P. Ketrenos <ipw2100-admin@linux.intel.com>
  23. * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24. *
  25. *****************************************************************************/
  26. #ifndef __iwl_3945_rs_h__
  27. #define __iwl_3945_rs_h__
  28. struct iwl_rate_info {
  29. u8 plcp;
  30. u8 ieee;
  31. u8 prev_ieee; /* previous rate in IEEE speeds */
  32. u8 next_ieee; /* next rate in IEEE speeds */
  33. u8 prev_rs; /* previous rate used in rs algo */
  34. u8 next_rs; /* next rate used in rs algo */
  35. u8 prev_rs_tgg; /* previous rate used in TGG rs algo */
  36. u8 next_rs_tgg; /* next rate used in TGG rs algo */
  37. };
  38. enum {
  39. IWL_RATE_6M_INDEX = 0,
  40. IWL_RATE_9M_INDEX,
  41. IWL_RATE_12M_INDEX,
  42. IWL_RATE_18M_INDEX,
  43. IWL_RATE_24M_INDEX,
  44. IWL_RATE_36M_INDEX,
  45. IWL_RATE_48M_INDEX,
  46. IWL_RATE_54M_INDEX,
  47. IWL_RATE_1M_INDEX,
  48. IWL_RATE_2M_INDEX,
  49. IWL_RATE_5M_INDEX,
  50. IWL_RATE_11M_INDEX,
  51. IWL_RATE_COUNT,
  52. IWL_RATE_INVM_INDEX,
  53. IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
  54. };
  55. enum {
  56. IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
  57. IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
  58. IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
  59. IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
  60. };
  61. /* #define vs. enum to keep from defaulting to 'large integer' */
  62. #define IWL_RATE_6M_MASK (1<<IWL_RATE_6M_INDEX)
  63. #define IWL_RATE_9M_MASK (1<<IWL_RATE_9M_INDEX)
  64. #define IWL_RATE_12M_MASK (1<<IWL_RATE_12M_INDEX)
  65. #define IWL_RATE_18M_MASK (1<<IWL_RATE_18M_INDEX)
  66. #define IWL_RATE_24M_MASK (1<<IWL_RATE_24M_INDEX)
  67. #define IWL_RATE_36M_MASK (1<<IWL_RATE_36M_INDEX)
  68. #define IWL_RATE_48M_MASK (1<<IWL_RATE_48M_INDEX)
  69. #define IWL_RATE_54M_MASK (1<<IWL_RATE_54M_INDEX)
  70. #define IWL_RATE_1M_MASK (1<<IWL_RATE_1M_INDEX)
  71. #define IWL_RATE_2M_MASK (1<<IWL_RATE_2M_INDEX)
  72. #define IWL_RATE_5M_MASK (1<<IWL_RATE_5M_INDEX)
  73. #define IWL_RATE_11M_MASK (1<<IWL_RATE_11M_INDEX)
  74. enum {
  75. IWL_RATE_6M_PLCP = 13,
  76. IWL_RATE_9M_PLCP = 15,
  77. IWL_RATE_12M_PLCP = 5,
  78. IWL_RATE_18M_PLCP = 7,
  79. IWL_RATE_24M_PLCP = 9,
  80. IWL_RATE_36M_PLCP = 11,
  81. IWL_RATE_48M_PLCP = 1,
  82. IWL_RATE_54M_PLCP = 3,
  83. IWL_RATE_1M_PLCP = 10,
  84. IWL_RATE_2M_PLCP = 20,
  85. IWL_RATE_5M_PLCP = 55,
  86. IWL_RATE_11M_PLCP = 110,
  87. };
  88. enum {
  89. IWL_RATE_6M_IEEE = 12,
  90. IWL_RATE_9M_IEEE = 18,
  91. IWL_RATE_12M_IEEE = 24,
  92. IWL_RATE_18M_IEEE = 36,
  93. IWL_RATE_24M_IEEE = 48,
  94. IWL_RATE_36M_IEEE = 72,
  95. IWL_RATE_48M_IEEE = 96,
  96. IWL_RATE_54M_IEEE = 108,
  97. IWL_RATE_1M_IEEE = 2,
  98. IWL_RATE_2M_IEEE = 4,
  99. IWL_RATE_5M_IEEE = 11,
  100. IWL_RATE_11M_IEEE = 22,
  101. };
  102. #define IWL_CCK_BASIC_RATES_MASK \
  103. (IWL_RATE_1M_MASK | \
  104. IWL_RATE_2M_MASK)
  105. #define IWL_CCK_RATES_MASK \
  106. (IWL_BASIC_RATES_MASK | \
  107. IWL_RATE_5M_MASK | \
  108. IWL_RATE_11M_MASK)
  109. #define IWL_OFDM_BASIC_RATES_MASK \
  110. (IWL_RATE_6M_MASK | \
  111. IWL_RATE_12M_MASK | \
  112. IWL_RATE_24M_MASK)
  113. #define IWL_OFDM_RATES_MASK \
  114. (IWL_OFDM_BASIC_RATES_MASK | \
  115. IWL_RATE_9M_MASK | \
  116. IWL_RATE_18M_MASK | \
  117. IWL_RATE_36M_MASK | \
  118. IWL_RATE_48M_MASK | \
  119. IWL_RATE_54M_MASK)
  120. #define IWL_BASIC_RATES_MASK \
  121. (IWL_OFDM_BASIC_RATES_MASK | \
  122. IWL_CCK_BASIC_RATES_MASK)
  123. #define IWL_RATES_MASK ((1<<IWL_RATE_COUNT)-1)
  124. #define IWL_INVALID_VALUE -1
  125. #define IWL_MIN_RSSI_VAL -100
  126. #define IWL_MAX_RSSI_VAL 0
  127. extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
  128. static inline u8 iwl_get_prev_ieee_rate(u8 rate_index)
  129. {
  130. u8 rate = iwl_rates[rate_index].prev_ieee;
  131. if (rate == IWL_RATE_INVALID)
  132. rate = rate_index;
  133. return rate;
  134. }
  135. /**
  136. * iwl_fill_rs_info - Fill an output text buffer with the rate representation
  137. *
  138. * NOTE: This is provided as a quick mechanism for a user to visualize
  139. * the performance of the rate control alogirthm and is not meant to be
  140. * parsed software.
  141. */
  142. extern int iwl_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id);
  143. /**
  144. * iwl_rate_scale_init - Initialize the rate scale table based on assoc info
  145. *
  146. * The specific througput table used is based on the type of network
  147. * the associated with, including A, B, G, and G w/ TGG protection
  148. */
  149. extern void iwl_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
  150. /**
  151. * iwl_rate_control_register - Register the rate control algorithm callbacks
  152. *
  153. * Since the rate control algorithm is hardware specific, there is no need
  154. * or reason to place it as a stand alone module. The driver can call
  155. * iwl_rate_control_register in order to register the rate control callbacks
  156. * with the mac80211 subsystem. This should be performed prior to calling
  157. * ieee80211_register_hw
  158. *
  159. */
  160. extern void iwl_rate_control_register(struct ieee80211_hw *hw);
  161. /**
  162. * iwl_rate_control_unregister - Unregister the rate control callbacks
  163. *
  164. * This should be called after calling ieee80211_unregister_hw, but before
  165. * the driver is unloaded.
  166. */
  167. extern void iwl_rate_control_unregister(struct ieee80211_hw *hw);
  168. #endif