diff options
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap/wl1271/0004-wl1271-11n-Support-functionality-and-configuration-a.patch')
-rw-r--r-- | extras/recipes-kernel/linux/linux-omap/wl1271/0004-wl1271-11n-Support-functionality-and-configuration-a.patch | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap/wl1271/0004-wl1271-11n-Support-functionality-and-configuration-a.patch b/extras/recipes-kernel/linux/linux-omap/wl1271/0004-wl1271-11n-Support-functionality-and-configuration-a.patch new file mode 100644 index 00000000..17ed6e63 --- /dev/null +++ b/extras/recipes-kernel/linux/linux-omap/wl1271/0004-wl1271-11n-Support-functionality-and-configuration-a.patch | |||
@@ -0,0 +1,249 @@ | |||
1 | From 9685ab91494ae35d2cb7e0033c5ee1bf3cdf0c64 Mon Sep 17 00:00:00 2001 | ||
2 | From: Shahar Levi <shahar_levi@ti.com> | ||
3 | Date: Wed, 13 Oct 2010 16:09:41 +0200 | ||
4 | Subject: [PATCH 04/15] wl1271: 11n Support, functionality and configuration ability | ||
5 | |||
6 | Add 11n ability in scan, connection and using MCS rates. | ||
7 | The configuration is temporary due to the code incomplete and | ||
8 | still in testing process. That plans to be remove in the future. | ||
9 | |||
10 | Signed-off-by: Shahar Levi <shahar_levi@ti.com> | ||
11 | Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com> | ||
12 | Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com> | ||
13 | --- | ||
14 | drivers/net/wireless/wl12xx/Kconfig | 10 +++ | ||
15 | drivers/net/wireless/wl12xx/wl1271_main.c | 96 +++++++++++++++++++++++------ | ||
16 | drivers/net/wireless/wl12xx/wl1271_rx.c | 6 ++ | ||
17 | drivers/net/wireless/wl12xx/wl1271_tx.c | 11 +++ | ||
18 | 4 files changed, 105 insertions(+), 18 deletions(-) | ||
19 | |||
20 | diff --git a/drivers/net/wireless/wl12xx/Kconfig b/drivers/net/wireless/wl12xx/Kconfig | ||
21 | index b447559..1b3b7bd 100644 | ||
22 | --- a/drivers/net/wireless/wl12xx/Kconfig | ||
23 | +++ b/drivers/net/wireless/wl12xx/Kconfig | ||
24 | @@ -18,6 +18,16 @@ config WL1271 | ||
25 | If you choose to build a module, it'll be called wl1271. Say N if | ||
26 | unsure. | ||
27 | |||
28 | +config WL1271_HT | ||
29 | + bool "TI wl1271 802.11 HT support (EXPERIMENTAL)" | ||
30 | + depends on WL1271 && EXPERIMENTAL | ||
31 | + default n | ||
32 | + ---help--- | ||
33 | + This will enable 802.11 HT support for TI wl1271 chipset. | ||
34 | + | ||
35 | + That configuration is temporary due to the code incomplete and | ||
36 | + still in testing process. | ||
37 | + | ||
38 | config WL1271_SPI | ||
39 | tristate "TI wl1271 SPI support" | ||
40 | depends on WL1271 && SPI_MASTER | ||
41 | diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c | ||
42 | index 785b73c..49ec0ef 100644 | ||
43 | --- a/drivers/net/wireless/wl12xx/wl1271_main.c | ||
44 | +++ b/drivers/net/wireless/wl12xx/wl1271_main.c | ||
45 | @@ -851,12 +851,32 @@ static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
46 | struct ieee80211_sta *sta = txinfo->control.sta; | ||
47 | unsigned long flags; | ||
48 | |||
49 | - /* peek into the rates configured in the STA entry */ | ||
50 | + /* | ||
51 | + * peek into the rates configured in the STA entry. | ||
52 | + * The rates set after connection stage, The first block only BG sets: | ||
53 | + * the compare is for bit 0-16 of sta_rate_set. The second block add | ||
54 | + * HT rates in case of HT supported. | ||
55 | + */ | ||
56 | spin_lock_irqsave(&wl->wl_lock, flags); | ||
57 | - if (sta && sta->supp_rates[conf->channel->band] != wl->sta_rate_set) { | ||
58 | + if (sta && | ||
59 | + (sta->supp_rates[conf->channel->band] != | ||
60 | + (wl->sta_rate_set & HW_BG_RATES_MASK))) { | ||
61 | wl->sta_rate_set = sta->supp_rates[conf->channel->band]; | ||
62 | set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags); | ||
63 | } | ||
64 | + | ||
65 | +#ifdef CONFIG_WL1271_HT | ||
66 | + if (sta && | ||
67 | + sta->ht_cap.ht_supported && | ||
68 | + ((wl->sta_rate_set >> HW_HT_RATES_OFFSET) != | ||
69 | + sta->ht_cap.mcs.rx_mask[0])) { | ||
70 | + /* Clean MCS bits before setting them */ | ||
71 | + wl->sta_rate_set &= HW_BG_RATES_MASK; | ||
72 | + wl->sta_rate_set |= | ||
73 | + (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET); | ||
74 | + set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags); | ||
75 | + } | ||
76 | +#endif | ||
77 | spin_unlock_irqrestore(&wl->wl_lock, flags); | ||
78 | |||
79 | /* queue the packet */ | ||
80 | @@ -1709,6 +1729,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, | ||
81 | { | ||
82 | enum wl1271_cmd_ps_mode mode; | ||
83 | struct wl1271 *wl = hw->priv; | ||
84 | + struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid); | ||
85 | bool do_join = false; | ||
86 | bool set_assoc = false; | ||
87 | int ret; | ||
88 | @@ -1927,6 +1948,37 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, | ||
89 | } | ||
90 | } | ||
91 | |||
92 | + /* | ||
93 | + * Takes care of: New association with HT enable, | ||
94 | + * HT information change in beacon. | ||
95 | + */ | ||
96 | + if (sta && | ||
97 | + (changed & BSS_CHANGED_HT) && | ||
98 | + (bss_conf->channel_type != NL80211_CHAN_NO_HT)) { | ||
99 | + ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true); | ||
100 | + if (ret < 0) { | ||
101 | + wl1271_warning("Set ht cap true failed %d", ret); | ||
102 | + goto out_sleep; | ||
103 | + } | ||
104 | + ret = wl1271_acx_set_ht_information(wl, | ||
105 | + bss_conf->ht_operation_mode); | ||
106 | + if (ret < 0) { | ||
107 | + wl1271_warning("Set ht information failed %d", ret); | ||
108 | + goto out_sleep; | ||
109 | + } | ||
110 | + } | ||
111 | + /* | ||
112 | + * Takes care of: New association without HT, | ||
113 | + * Disassociation. | ||
114 | + */ | ||
115 | + else if (sta && (changed & BSS_CHANGED_ASSOC)) { | ||
116 | + ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, false); | ||
117 | + if (ret < 0) { | ||
118 | + wl1271_warning("Set ht cap false failed %d", ret); | ||
119 | + goto out_sleep; | ||
120 | + } | ||
121 | + } | ||
122 | + | ||
123 | if (changed & BSS_CHANGED_ARP_FILTER) { | ||
124 | __be32 addr = bss_conf->arp_addr_list[0]; | ||
125 | WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS); | ||
126 | @@ -2107,14 +2159,14 @@ static struct ieee80211_channel wl1271_channels[] = { | ||
127 | /* mapping to indexes for wl1271_rates */ | ||
128 | static const u8 wl1271_rate_to_idx_2ghz[] = { | ||
129 | /* MCS rates are used only with 11n */ | ||
130 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */ | ||
131 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */ | ||
132 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */ | ||
133 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */ | ||
134 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */ | ||
135 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */ | ||
136 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */ | ||
137 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */ | ||
138 | + 7, /* CONF_HW_RXTX_RATE_MCS7 */ | ||
139 | + 6, /* CONF_HW_RXTX_RATE_MCS6 */ | ||
140 | + 5, /* CONF_HW_RXTX_RATE_MCS5 */ | ||
141 | + 4, /* CONF_HW_RXTX_RATE_MCS4 */ | ||
142 | + 3, /* CONF_HW_RXTX_RATE_MCS3 */ | ||
143 | + 2, /* CONF_HW_RXTX_RATE_MCS2 */ | ||
144 | + 1, /* CONF_HW_RXTX_RATE_MCS1 */ | ||
145 | + 0, /* CONF_HW_RXTX_RATE_MCS0 */ | ||
146 | |||
147 | 11, /* CONF_HW_RXTX_RATE_54 */ | ||
148 | 10, /* CONF_HW_RXTX_RATE_48 */ | ||
149 | @@ -2137,6 +2189,7 @@ static const u8 wl1271_rate_to_idx_2ghz[] = { | ||
150 | /* 11n STA capabilities */ | ||
151 | #define HW_RX_HIGHEST_RATE 72 | ||
152 | |||
153 | +#ifdef CONFIG_WL1271_HT | ||
154 | #define WL1271_HT_CAP { \ | ||
155 | .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \ | ||
156 | .ht_supported = true, \ | ||
157 | @@ -2148,6 +2201,11 @@ static const u8 wl1271_rate_to_idx_2ghz[] = { | ||
158 | .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \ | ||
159 | }, \ | ||
160 | } | ||
161 | +#else | ||
162 | +#define WL1271_HT_CAP { \ | ||
163 | + .ht_supported = false, \ | ||
164 | +} | ||
165 | +#endif | ||
166 | |||
167 | /* can't be const, mac80211 writes to this */ | ||
168 | static struct ieee80211_supported_band wl1271_band_2ghz = { | ||
169 | @@ -2155,6 +2213,7 @@ static struct ieee80211_supported_band wl1271_band_2ghz = { | ||
170 | .n_channels = ARRAY_SIZE(wl1271_channels), | ||
171 | .bitrates = wl1271_rates, | ||
172 | .n_bitrates = ARRAY_SIZE(wl1271_rates), | ||
173 | + .ht_cap = WL1271_HT_CAP, | ||
174 | }; | ||
175 | |||
176 | /* 5 GHz data rates for WL1273 */ | ||
177 | @@ -2237,14 +2296,14 @@ static struct ieee80211_channel wl1271_channels_5ghz[] = { | ||
178 | /* mapping to indexes for wl1271_rates_5ghz */ | ||
179 | static const u8 wl1271_rate_to_idx_5ghz[] = { | ||
180 | /* MCS rates are used only with 11n */ | ||
181 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */ | ||
182 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */ | ||
183 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */ | ||
184 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */ | ||
185 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */ | ||
186 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */ | ||
187 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */ | ||
188 | - CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */ | ||
189 | + 7, /* CONF_HW_RXTX_RATE_MCS7 */ | ||
190 | + 6, /* CONF_HW_RXTX_RATE_MCS6 */ | ||
191 | + 5, /* CONF_HW_RXTX_RATE_MCS5 */ | ||
192 | + 4, /* CONF_HW_RXTX_RATE_MCS4 */ | ||
193 | + 3, /* CONF_HW_RXTX_RATE_MCS3 */ | ||
194 | + 2, /* CONF_HW_RXTX_RATE_MCS2 */ | ||
195 | + 1, /* CONF_HW_RXTX_RATE_MCS1 */ | ||
196 | + 0, /* CONF_HW_RXTX_RATE_MCS0 */ | ||
197 | |||
198 | 7, /* CONF_HW_RXTX_RATE_54 */ | ||
199 | 6, /* CONF_HW_RXTX_RATE_48 */ | ||
200 | @@ -2269,6 +2328,7 @@ static struct ieee80211_supported_band wl1271_band_5ghz = { | ||
201 | .n_channels = ARRAY_SIZE(wl1271_channels_5ghz), | ||
202 | .bitrates = wl1271_rates_5ghz, | ||
203 | .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz), | ||
204 | + .ht_cap = WL1271_HT_CAP, | ||
205 | }; | ||
206 | |||
207 | static const u8 *wl1271_band_rate_to_idx[] = { | ||
208 | diff --git a/drivers/net/wireless/wl12xx/wl1271_rx.c b/drivers/net/wireless/wl12xx/wl1271_rx.c | ||
209 | index bea133b..ac13f7d 100644 | ||
210 | --- a/drivers/net/wireless/wl12xx/wl1271_rx.c | ||
211 | +++ b/drivers/net/wireless/wl12xx/wl1271_rx.c | ||
212 | @@ -53,6 +53,12 @@ static void wl1271_rx_status(struct wl1271 *wl, | ||
213 | status->band = wl->band; | ||
214 | status->rate_idx = wl1271_rate_to_idx(wl, desc->rate); | ||
215 | |||
216 | +#ifdef CONFIG_WL1271_HT | ||
217 | + /* 11n support */ | ||
218 | + if (desc->rate <= CONF_HW_RXTX_RATE_MCS0) | ||
219 | + status->flag |= RX_FLAG_HT; | ||
220 | +#endif | ||
221 | + | ||
222 | status->signal = desc->rssi; | ||
223 | |||
224 | /* | ||
225 | diff --git a/drivers/net/wireless/wl12xx/wl1271_tx.c b/drivers/net/wireless/wl12xx/wl1271_tx.c | ||
226 | index e3dc13c..6a87633 100644 | ||
227 | --- a/drivers/net/wireless/wl12xx/wl1271_tx.c | ||
228 | +++ b/drivers/net/wireless/wl12xx/wl1271_tx.c | ||
229 | @@ -201,6 +201,17 @@ u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set) | ||
230 | rate_set >>= 1; | ||
231 | } | ||
232 | |||
233 | +#ifdef CONFIG_WL1271_HT | ||
234 | + /* MCS rates indication are on bits 16 - 23 */ | ||
235 | + rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates; | ||
236 | + | ||
237 | + for (bit = 0; bit < 8; bit++) { | ||
238 | + if (rate_set & 0x1) | ||
239 | + enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit); | ||
240 | + rate_set >>= 1; | ||
241 | + } | ||
242 | +#endif | ||
243 | + | ||
244 | return enabled_rates; | ||
245 | } | ||
246 | |||
247 | -- | ||
248 | 1.6.6.1 | ||
249 | |||