iwl-3945-rs.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2005 - 2008 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. * Intel Linux Wireless <ilw@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 iwl3945_rate_info {
  29. u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */
  30. u8 ieee; /* MAC header: IWL_RATE_6M_IEEE, etc. */
  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. u8 table_rs_index; /* index in rate scale table cmd */
  38. u8 prev_table_rs; /* prev in rate table cmd */
  39. };
  40. /*
  41. * These serve as indexes into
  42. * struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT];
  43. */
  44. enum {
  45. IWL_RATE_1M_INDEX = 0,
  46. IWL_RATE_2M_INDEX,
  47. IWL_RATE_5M_INDEX,
  48. IWL_RATE_11M_INDEX,
  49. IWL_RATE_6M_INDEX,
  50. IWL_RATE_9M_INDEX,
  51. IWL_RATE_12M_INDEX,
  52. IWL_RATE_18M_INDEX,
  53. IWL_RATE_24M_INDEX,
  54. IWL_RATE_36M_INDEX,
  55. IWL_RATE_48M_INDEX,
  56. IWL_RATE_54M_INDEX,
  57. IWL_RATE_COUNT,
  58. IWL_RATE_INVM_INDEX,
  59. IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
  60. };
  61. enum {
  62. IWL_RATE_6M_INDEX_TABLE = 0,
  63. IWL_RATE_9M_INDEX_TABLE,
  64. IWL_RATE_12M_INDEX_TABLE,
  65. IWL_RATE_18M_INDEX_TABLE,
  66. IWL_RATE_24M_INDEX_TABLE,
  67. IWL_RATE_36M_INDEX_TABLE,
  68. IWL_RATE_48M_INDEX_TABLE,
  69. IWL_RATE_54M_INDEX_TABLE,
  70. IWL_RATE_1M_INDEX_TABLE,
  71. IWL_RATE_2M_INDEX_TABLE,
  72. IWL_RATE_5M_INDEX_TABLE,
  73. IWL_RATE_11M_INDEX_TABLE,
  74. IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX,
  75. };
  76. enum {
  77. IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
  78. IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
  79. IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
  80. IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
  81. };
  82. /* #define vs. enum to keep from defaulting to 'large integer' */
  83. #define IWL_RATE_6M_MASK (1 << IWL_RATE_6M_INDEX)
  84. #define IWL_RATE_9M_MASK (1 << IWL_RATE_9M_INDEX)
  85. #define IWL_RATE_12M_MASK (1 << IWL_RATE_12M_INDEX)
  86. #define IWL_RATE_18M_MASK (1 << IWL_RATE_18M_INDEX)
  87. #define IWL_RATE_24M_MASK (1 << IWL_RATE_24M_INDEX)
  88. #define IWL_RATE_36M_MASK (1 << IWL_RATE_36M_INDEX)
  89. #define IWL_RATE_48M_MASK (1 << IWL_RATE_48M_INDEX)
  90. #define IWL_RATE_54M_MASK (1 << IWL_RATE_54M_INDEX)
  91. #define IWL_RATE_1M_MASK (1 << IWL_RATE_1M_INDEX)
  92. #define IWL_RATE_2M_MASK (1 << IWL_RATE_2M_INDEX)
  93. #define IWL_RATE_5M_MASK (1 << IWL_RATE_5M_INDEX)
  94. #define IWL_RATE_11M_MASK (1 << IWL_RATE_11M_INDEX)
  95. /* 3945 uCode API values for (legacy) bit rates, both OFDM and CCK */
  96. enum {
  97. IWL_RATE_6M_PLCP = 13,
  98. IWL_RATE_9M_PLCP = 15,
  99. IWL_RATE_12M_PLCP = 5,
  100. IWL_RATE_18M_PLCP = 7,
  101. IWL_RATE_24M_PLCP = 9,
  102. IWL_RATE_36M_PLCP = 11,
  103. IWL_RATE_48M_PLCP = 1,
  104. IWL_RATE_54M_PLCP = 3,
  105. IWL_RATE_1M_PLCP = 10,
  106. IWL_RATE_2M_PLCP = 20,
  107. IWL_RATE_5M_PLCP = 55,
  108. IWL_RATE_11M_PLCP = 110,
  109. };
  110. /* MAC header values for bit rates */
  111. enum {
  112. IWL_RATE_6M_IEEE = 12,
  113. IWL_RATE_9M_IEEE = 18,
  114. IWL_RATE_12M_IEEE = 24,
  115. IWL_RATE_18M_IEEE = 36,
  116. IWL_RATE_24M_IEEE = 48,
  117. IWL_RATE_36M_IEEE = 72,
  118. IWL_RATE_48M_IEEE = 96,
  119. IWL_RATE_54M_IEEE = 108,
  120. IWL_RATE_1M_IEEE = 2,
  121. IWL_RATE_2M_IEEE = 4,
  122. IWL_RATE_5M_IEEE = 11,
  123. IWL_RATE_11M_IEEE = 22,
  124. };
  125. #define IWL_CCK_BASIC_RATES_MASK \
  126. (IWL_RATE_1M_MASK | \
  127. IWL_RATE_2M_MASK)
  128. #define IWL_CCK_RATES_MASK \
  129. (IWL_BASIC_RATES_MASK | \
  130. IWL_RATE_5M_MASK | \
  131. IWL_RATE_11M_MASK)
  132. #define IWL_OFDM_BASIC_RATES_MASK \
  133. (IWL_RATE_6M_MASK | \
  134. IWL_RATE_12M_MASK | \
  135. IWL_RATE_24M_MASK)
  136. #define IWL_OFDM_RATES_MASK \
  137. (IWL_OFDM_BASIC_RATES_MASK | \
  138. IWL_RATE_9M_MASK | \
  139. IWL_RATE_18M_MASK | \
  140. IWL_RATE_36M_MASK | \
  141. IWL_RATE_48M_MASK | \
  142. IWL_RATE_54M_MASK)
  143. #define IWL_BASIC_RATES_MASK \
  144. (IWL_OFDM_BASIC_RATES_MASK | \
  145. IWL_CCK_BASIC_RATES_MASK)
  146. #define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
  147. #define IWL_INV_TPT -1
  148. #define IWL_MIN_RSSI_VAL -100
  149. #define IWL_MAX_RSSI_VAL 0
  150. extern const struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT];
  151. static inline u8 iwl3945_get_prev_ieee_rate(u8 rate_index)
  152. {
  153. u8 rate = iwl3945_rates[rate_index].prev_ieee;
  154. if (rate == IWL_RATE_INVALID)
  155. rate = rate_index;
  156. return rate;
  157. }
  158. /**
  159. * iwl3945_rate_scale_init - Initialize the rate scale table based on assoc info
  160. *
  161. * The specific throughput table used is based on the type of network
  162. * the associated with, including A, B, G, and G w/ TGG protection
  163. */
  164. extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
  165. /**
  166. * iwl3945_rate_control_register - Register the rate control algorithm callbacks
  167. *
  168. * Since the rate control algorithm is hardware specific, there is no need
  169. * or reason to place it as a stand alone module. The driver can call
  170. * iwl3945_rate_control_register in order to register the rate control callbacks
  171. * with the mac80211 subsystem. This should be performed prior to calling
  172. * ieee80211_register_hw
  173. *
  174. */
  175. extern int iwl3945_rate_control_register(void);
  176. /**
  177. * iwl3945_rate_control_unregister - Unregister the rate control callbacks
  178. *
  179. * This should be called after calling ieee80211_unregister_hw, but before
  180. * the driver is unloaded.
  181. */
  182. extern void iwl3945_rate_control_unregister(void);
  183. #endif