diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-rs.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 7e5cf1a2b21e..5abe2e9ff0d2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -77,6 +77,74 @@ static const u8 ant_toggle_lookup[] = { | |||
77 | /*ANT_ABC -> */ ANT_ABC, | 77 | /*ANT_ABC -> */ ANT_ABC, |
78 | }; | 78 | }; |
79 | 79 | ||
80 | #define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np) \ | ||
81 | [IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \ | ||
82 | IWL_RATE_SISO_##s##M_PLCP, \ | ||
83 | IWL_RATE_MIMO2_##s##M_PLCP,\ | ||
84 | IWL_RATE_MIMO3_##s##M_PLCP,\ | ||
85 | IWL_RATE_##r##M_IEEE, \ | ||
86 | IWL_RATE_##ip##M_INDEX, \ | ||
87 | IWL_RATE_##in##M_INDEX, \ | ||
88 | IWL_RATE_##rp##M_INDEX, \ | ||
89 | IWL_RATE_##rn##M_INDEX, \ | ||
90 | IWL_RATE_##pp##M_INDEX, \ | ||
91 | IWL_RATE_##np##M_INDEX } | ||
92 | |||
93 | /* | ||
94 | * Parameter order: | ||
95 | * rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate | ||
96 | * | ||
97 | * If there isn't a valid next or previous rate then INV is used which | ||
98 | * maps to IWL_RATE_INVALID | ||
99 | * | ||
100 | */ | ||
101 | const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT] = { | ||
102 | IWL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2), /* 1mbps */ | ||
103 | IWL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5), /* 2mbps */ | ||
104 | IWL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11), /*5.5mbps */ | ||
105 | IWL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18), /* 11mbps */ | ||
106 | IWL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11), /* 6mbps */ | ||
107 | IWL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11), /* 9mbps */ | ||
108 | IWL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18), /* 12mbps */ | ||
109 | IWL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24), /* 18mbps */ | ||
110 | IWL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36), /* 24mbps */ | ||
111 | IWL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48), /* 36mbps */ | ||
112 | IWL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54), /* 48mbps */ | ||
113 | IWL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */ | ||
114 | IWL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */ | ||
115 | /* FIXME:RS: ^^ should be INV (legacy) */ | ||
116 | }; | ||
117 | |||
118 | static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags) | ||
119 | { | ||
120 | int idx = 0; | ||
121 | |||
122 | /* HT rate format */ | ||
123 | if (rate_n_flags & RATE_MCS_HT_MSK) { | ||
124 | idx = (rate_n_flags & 0xff); | ||
125 | |||
126 | if (idx >= IWL_RATE_MIMO3_6M_PLCP) | ||
127 | idx = idx - IWL_RATE_MIMO3_6M_PLCP; | ||
128 | else if (idx >= IWL_RATE_MIMO2_6M_PLCP) | ||
129 | idx = idx - IWL_RATE_MIMO2_6M_PLCP; | ||
130 | |||
131 | idx += IWL_FIRST_OFDM_RATE; | ||
132 | /* skip 9M not supported in ht*/ | ||
133 | if (idx >= IWL_RATE_9M_INDEX) | ||
134 | idx += 1; | ||
135 | if ((idx >= IWL_FIRST_OFDM_RATE) && (idx <= IWL_LAST_OFDM_RATE)) | ||
136 | return idx; | ||
137 | |||
138 | /* legacy rate format, search for match in table */ | ||
139 | } else { | ||
140 | for (idx = 0; idx < ARRAY_SIZE(iwl_rates); idx++) | ||
141 | if (iwl_rates[idx].plcp == (rate_n_flags & 0xFF)) | ||
142 | return idx; | ||
143 | } | ||
144 | |||
145 | return -1; | ||
146 | } | ||
147 | |||
80 | static void rs_rate_scale_perform(struct iwl_priv *priv, | 148 | static void rs_rate_scale_perform(struct iwl_priv *priv, |
81 | struct sk_buff *skb, | 149 | struct sk_buff *skb, |
82 | struct ieee80211_sta *sta, | 150 | struct ieee80211_sta *sta, |