summaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap/wl1271/0004-wl1271-11n-Support-functionality-and-configuration-a.patch
diff options
context:
space:
mode:
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.patch249
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 @@
1From 9685ab91494ae35d2cb7e0033c5ee1bf3cdf0c64 Mon Sep 17 00:00:00 2001
2From: Shahar Levi <shahar_levi@ti.com>
3Date: Wed, 13 Oct 2010 16:09:41 +0200
4Subject: [PATCH 04/15] wl1271: 11n Support, functionality and configuration ability
5
6Add 11n ability in scan, connection and using MCS rates.
7The configuration is temporary due to the code incomplete and
8still in testing process. That plans to be remove in the future.
9
10Signed-off-by: Shahar Levi <shahar_levi@ti.com>
11Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
12Signed-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
20diff --git a/drivers/net/wireless/wl12xx/Kconfig b/drivers/net/wireless/wl12xx/Kconfig
21index 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
41diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c
42index 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[] = {
208diff --git a/drivers/net/wireless/wl12xx/wl1271_rx.c b/drivers/net/wireless/wl12xx/wl1271_rx.c
209index 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 /*
225diff --git a/drivers/net/wireless/wl12xx/wl1271_tx.c b/drivers/net/wireless/wl12xx/wl1271_tx.c
226index 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--
2481.6.6.1
249