iwl-4965-rs.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2003 - 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_4965_rs_h__
  27. #define __iwl_4965_rs_h__
  28. #include "iwl-4965.h"
  29. struct iwl_rate_info {
  30. u8 plcp;
  31. u8 plcp_siso;
  32. u8 plcp_mimo;
  33. u8 ieee;
  34. u8 prev_ieee; /* previous rate in IEEE speeds */
  35. u8 next_ieee; /* next rate in IEEE speeds */
  36. u8 prev_rs; /* previous rate used in rs algo */
  37. u8 next_rs; /* next rate used in rs algo */
  38. u8 prev_rs_tgg; /* previous rate used in TGG rs algo */
  39. u8 next_rs_tgg; /* next rate used in TGG rs algo */
  40. };
  41. enum {
  42. IWL_RATE_1M_INDEX = 0,
  43. IWL_RATE_2M_INDEX,
  44. IWL_RATE_5M_INDEX,
  45. IWL_RATE_11M_INDEX,
  46. IWL_RATE_6M_INDEX,
  47. IWL_RATE_9M_INDEX,
  48. IWL_RATE_12M_INDEX,
  49. IWL_RATE_18M_INDEX,
  50. IWL_RATE_24M_INDEX,
  51. IWL_RATE_36M_INDEX,
  52. IWL_RATE_48M_INDEX,
  53. IWL_RATE_54M_INDEX,
  54. IWL_RATE_60M_INDEX,
  55. IWL_RATE_COUNT,
  56. IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
  57. IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
  58. };
  59. enum {
  60. IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
  61. IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
  62. IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
  63. IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
  64. };
  65. /* #define vs. enum to keep from defaulting to 'large integer' */
  66. #define IWL_RATE_6M_MASK (1<<IWL_RATE_6M_INDEX)
  67. #define IWL_RATE_9M_MASK (1<<IWL_RATE_9M_INDEX)
  68. #define IWL_RATE_12M_MASK (1<<IWL_RATE_12M_INDEX)
  69. #define IWL_RATE_18M_MASK (1<<IWL_RATE_18M_INDEX)
  70. #define IWL_RATE_24M_MASK (1<<IWL_RATE_24M_INDEX)
  71. #define IWL_RATE_36M_MASK (1<<IWL_RATE_36M_INDEX)
  72. #define IWL_RATE_48M_MASK (1<<IWL_RATE_48M_INDEX)
  73. #define IWL_RATE_54M_MASK (1<<IWL_RATE_54M_INDEX)
  74. #define IWL_RATE_60M_MASK (1<<IWL_RATE_60M_INDEX)
  75. #define IWL_RATE_1M_MASK (1<<IWL_RATE_1M_INDEX)
  76. #define IWL_RATE_2M_MASK (1<<IWL_RATE_2M_INDEX)
  77. #define IWL_RATE_5M_MASK (1<<IWL_RATE_5M_INDEX)
  78. #define IWL_RATE_11M_MASK (1<<IWL_RATE_11M_INDEX)
  79. enum {
  80. IWL_RATE_6M_PLCP = 13,
  81. IWL_RATE_9M_PLCP = 15,
  82. IWL_RATE_12M_PLCP = 5,
  83. IWL_RATE_18M_PLCP = 7,
  84. IWL_RATE_24M_PLCP = 9,
  85. IWL_RATE_36M_PLCP = 11,
  86. IWL_RATE_48M_PLCP = 1,
  87. IWL_RATE_54M_PLCP = 3,
  88. IWL_RATE_60M_PLCP = 3,
  89. IWL_RATE_1M_PLCP = 10,
  90. IWL_RATE_2M_PLCP = 20,
  91. IWL_RATE_5M_PLCP = 55,
  92. IWL_RATE_11M_PLCP = 110,
  93. };
  94. /* OFDM HT rate plcp */
  95. enum {
  96. IWL_RATE_SISO_6M_PLCP = 0,
  97. IWL_RATE_SISO_12M_PLCP = 1,
  98. IWL_RATE_SISO_18M_PLCP = 2,
  99. IWL_RATE_SISO_24M_PLCP = 3,
  100. IWL_RATE_SISO_36M_PLCP = 4,
  101. IWL_RATE_SISO_48M_PLCP = 5,
  102. IWL_RATE_SISO_54M_PLCP = 6,
  103. IWL_RATE_SISO_60M_PLCP = 7,
  104. IWL_RATE_MIMO_6M_PLCP = 0x8,
  105. IWL_RATE_MIMO_12M_PLCP = 0x9,
  106. IWL_RATE_MIMO_18M_PLCP = 0xa,
  107. IWL_RATE_MIMO_24M_PLCP = 0xb,
  108. IWL_RATE_MIMO_36M_PLCP = 0xc,
  109. IWL_RATE_MIMO_48M_PLCP = 0xd,
  110. IWL_RATE_MIMO_54M_PLCP = 0xe,
  111. IWL_RATE_MIMO_60M_PLCP = 0xf,
  112. IWL_RATE_SISO_INVM_PLCP,
  113. IWL_RATE_MIMO_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
  114. };
  115. enum {
  116. IWL_RATE_6M_IEEE = 12,
  117. IWL_RATE_9M_IEEE = 18,
  118. IWL_RATE_12M_IEEE = 24,
  119. IWL_RATE_18M_IEEE = 36,
  120. IWL_RATE_24M_IEEE = 48,
  121. IWL_RATE_36M_IEEE = 72,
  122. IWL_RATE_48M_IEEE = 96,
  123. IWL_RATE_54M_IEEE = 108,
  124. IWL_RATE_60M_IEEE = 120,
  125. IWL_RATE_1M_IEEE = 2,
  126. IWL_RATE_2M_IEEE = 4,
  127. IWL_RATE_5M_IEEE = 11,
  128. IWL_RATE_11M_IEEE = 22,
  129. };
  130. #define IWL_CCK_BASIC_RATES_MASK \
  131. (IWL_RATE_1M_MASK | \
  132. IWL_RATE_2M_MASK)
  133. #define IWL_CCK_RATES_MASK \
  134. (IWL_BASIC_RATES_MASK | \
  135. IWL_RATE_5M_MASK | \
  136. IWL_RATE_11M_MASK)
  137. #define IWL_OFDM_BASIC_RATES_MASK \
  138. (IWL_RATE_6M_MASK | \
  139. IWL_RATE_12M_MASK | \
  140. IWL_RATE_24M_MASK)
  141. #define IWL_OFDM_RATES_MASK \
  142. (IWL_OFDM_BASIC_RATES_MASK | \
  143. IWL_RATE_9M_MASK | \
  144. IWL_RATE_18M_MASK | \
  145. IWL_RATE_36M_MASK | \
  146. IWL_RATE_48M_MASK | \
  147. IWL_RATE_54M_MASK)
  148. #define IWL_BASIC_RATES_MASK \
  149. (IWL_OFDM_BASIC_RATES_MASK | \
  150. IWL_CCK_BASIC_RATES_MASK)
  151. #define IWL_RATES_MASK ((1<<IWL_RATE_COUNT)-1)
  152. #define IWL_INVALID_VALUE -1
  153. #define IWL_MIN_RSSI_VAL -100
  154. #define IWL_MAX_RSSI_VAL 0
  155. #define IWL_LEGACY_SWITCH_ANTENNA 0
  156. #define IWL_LEGACY_SWITCH_SISO 1
  157. #define IWL_LEGACY_SWITCH_MIMO 2
  158. #define IWL_RS_GOOD_RATIO 12800
  159. #define IWL_ACTION_LIMIT 3
  160. #define IWL_LEGACY_FAILURE_LIMIT 160
  161. #define IWL_LEGACY_SUCCESS_LIMIT 480
  162. #define IWL_LEGACY_TABLE_COUNT 160
  163. #define IWL_NONE_LEGACY_FAILURE_LIMIT 400
  164. #define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500
  165. #define IWL_NONE_LEGACY_TABLE_COUNT 1500
  166. #define IWL_RATE_SCALE_SWITCH (10880)
  167. #define IWL_SISO_SWITCH_ANTENNA 0
  168. #define IWL_SISO_SWITCH_MIMO 1
  169. #define IWL_SISO_SWITCH_GI 2
  170. #define IWL_MIMO_SWITCH_ANTENNA_A 0
  171. #define IWL_MIMO_SWITCH_ANTENNA_B 1
  172. #define IWL_MIMO_SWITCH_GI 2
  173. #define LQ_SIZE 2
  174. extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
  175. enum iwl_table_type {
  176. LQ_NONE,
  177. LQ_G,
  178. LQ_A,
  179. LQ_SISO,
  180. LQ_MIMO,
  181. LQ_MAX,
  182. };
  183. enum iwl_antenna_type {
  184. ANT_NONE,
  185. ANT_MAIN,
  186. ANT_AUX,
  187. ANT_BOTH,
  188. };
  189. static inline u8 iwl_get_prev_ieee_rate(u8 rate_index)
  190. {
  191. u8 rate = iwl_rates[rate_index].prev_ieee;
  192. if (rate == IWL_RATE_INVALID)
  193. rate = rate_index;
  194. return rate;
  195. }
  196. extern int iwl_rate_index_from_plcp(int plcp);
  197. /**
  198. * iwl_fill_rs_info - Fill an output text buffer with the rate representation
  199. *
  200. * NOTE: This is provided as a quick mechanism for a user to visualize
  201. * the performance of the rate control alogirthm and is not meant to be
  202. * parsed software.
  203. */
  204. extern int iwl_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id);
  205. /**
  206. * iwl_rate_scale_init - Initialize the rate scale table based on assoc info
  207. *
  208. * The specific througput table used is based on the type of network
  209. * the associated with, including A, B, G, and G w/ TGG protection
  210. */
  211. extern void iwl_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
  212. /**
  213. * iwl_rate_control_register - Register the rate control algorithm callbacks
  214. *
  215. * Since the rate control algorithm is hardware specific, there is no need
  216. * or reason to place it as a stand alone module. The driver can call
  217. * iwl_rate_control_register in order to register the rate control callbacks
  218. * with the mac80211 subsystem. This should be performed prior to calling
  219. * ieee80211_register_hw
  220. *
  221. */
  222. extern void iwl_rate_control_register(struct ieee80211_hw *hw);
  223. /**
  224. * iwl_rate_control_unregister - Unregister the rate control callbacks
  225. *
  226. * This should be called after calling ieee80211_unregister_hw, but before
  227. * the driver is unloaded.
  228. */
  229. extern void iwl_rate_control_unregister(struct ieee80211_hw *hw);
  230. #endif