diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/wl12xx/Kconfig | 10 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_main.c | 96 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_rx.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_tx.c | 11 |
4 files changed, 105 insertions, 18 deletions
diff --git a/drivers/net/wireless/wl12xx/Kconfig b/drivers/net/wireless/wl12xx/Kconfig index b447559f1db5..1b3b7bdd6a19 100644 --- a/drivers/net/wireless/wl12xx/Kconfig +++ b/drivers/net/wireless/wl12xx/Kconfig | |||
@@ -18,6 +18,16 @@ config WL1271 | |||
18 | If you choose to build a module, it'll be called wl1271. Say N if | 18 | If you choose to build a module, it'll be called wl1271. Say N if |
19 | unsure. | 19 | unsure. |
20 | 20 | ||
21 | config WL1271_HT | ||
22 | bool "TI wl1271 802.11 HT support (EXPERIMENTAL)" | ||
23 | depends on WL1271 && EXPERIMENTAL | ||
24 | default n | ||
25 | ---help--- | ||
26 | This will enable 802.11 HT support for TI wl1271 chipset. | ||
27 | |||
28 | That configuration is temporary due to the code incomplete and | ||
29 | still in testing process. | ||
30 | |||
21 | config WL1271_SPI | 31 | config WL1271_SPI |
22 | tristate "TI wl1271 SPI support" | 32 | tristate "TI wl1271 SPI support" |
23 | depends on WL1271 && SPI_MASTER | 33 | depends on WL1271 && SPI_MASTER |
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c index 5d5f4c6a9644..532ccd01cf6f 100644 --- a/drivers/net/wireless/wl12xx/wl1271_main.c +++ b/drivers/net/wireless/wl12xx/wl1271_main.c | |||
@@ -861,12 +861,32 @@ static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
861 | struct ieee80211_sta *sta = txinfo->control.sta; | 861 | struct ieee80211_sta *sta = txinfo->control.sta; |
862 | unsigned long flags; | 862 | unsigned long flags; |
863 | 863 | ||
864 | /* peek into the rates configured in the STA entry */ | 864 | /* |
865 | * peek into the rates configured in the STA entry. | ||
866 | * The rates set after connection stage, The first block only BG sets: | ||
867 | * the compare is for bit 0-16 of sta_rate_set. The second block add | ||
868 | * HT rates in case of HT supported. | ||
869 | */ | ||
865 | spin_lock_irqsave(&wl->wl_lock, flags); | 870 | spin_lock_irqsave(&wl->wl_lock, flags); |
866 | if (sta && sta->supp_rates[conf->channel->band] != wl->sta_rate_set) { | 871 | if (sta && |
872 | (sta->supp_rates[conf->channel->band] != | ||
873 | (wl->sta_rate_set & HW_BG_RATES_MASK))) { | ||
867 | wl->sta_rate_set = sta->supp_rates[conf->channel->band]; | 874 | wl->sta_rate_set = sta->supp_rates[conf->channel->band]; |
868 | set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags); | 875 | set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags); |
869 | } | 876 | } |
877 | |||
878 | #ifdef CONFIG_WL1271_HT | ||
879 | if (sta && | ||
880 | sta->ht_cap.ht_supported && | ||
881 | ((wl->sta_rate_set >> HW_HT_RATES_OFFSET) != | ||
882 | sta->ht_cap.mcs.rx_mask[0])) { | ||
883 | /* Clean MCS bits before setting them */ | ||
884 | wl->sta_rate_set &= HW_BG_RATES_MASK; | ||
885 | wl->sta_rate_set |= | ||
886 | (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET); | ||
887 | set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags); | ||
888 | } | ||
889 | #endif | ||
870 | spin_unlock_irqrestore(&wl->wl_lock, flags); | 890 | spin_unlock_irqrestore(&wl->wl_lock, flags); |
871 | 891 | ||
872 | /* queue the packet */ | 892 | /* queue the packet */ |
@@ -1720,6 +1740,7 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, | |||
1720 | { | 1740 | { |
1721 | enum wl1271_cmd_ps_mode mode; | 1741 | enum wl1271_cmd_ps_mode mode; |
1722 | struct wl1271 *wl = hw->priv; | 1742 | struct wl1271 *wl = hw->priv; |
1743 | struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid); | ||
1723 | bool do_join = false; | 1744 | bool do_join = false; |
1724 | bool set_assoc = false; | 1745 | bool set_assoc = false; |
1725 | int ret; | 1746 | int ret; |
@@ -1938,6 +1959,37 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw, | |||
1938 | } | 1959 | } |
1939 | } | 1960 | } |
1940 | 1961 | ||
1962 | /* | ||
1963 | * Takes care of: New association with HT enable, | ||
1964 | * HT information change in beacon. | ||
1965 | */ | ||
1966 | if (sta && | ||
1967 | (changed & BSS_CHANGED_HT) && | ||
1968 | (bss_conf->channel_type != NL80211_CHAN_NO_HT)) { | ||
1969 | ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true); | ||
1970 | if (ret < 0) { | ||
1971 | wl1271_warning("Set ht cap true failed %d", ret); | ||
1972 | goto out_sleep; | ||
1973 | } | ||
1974 | ret = wl1271_acx_set_ht_information(wl, | ||
1975 | bss_conf->ht_operation_mode); | ||
1976 | if (ret < 0) { | ||
1977 | wl1271_warning("Set ht information failed %d", ret); | ||
1978 | goto out_sleep; | ||
1979 | } | ||
1980 | } | ||
1981 | /* | ||
1982 | * Takes care of: New association without HT, | ||
1983 | * Disassociation. | ||
1984 | */ | ||
1985 | else if (sta && (changed & BSS_CHANGED_ASSOC)) { | ||
1986 | ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, false); | ||
1987 | if (ret < 0) { | ||
1988 | wl1271_warning("Set ht cap false failed %d", ret); | ||
1989 | goto out_sleep; | ||
1990 | } | ||
1991 | } | ||
1992 | |||
1941 | if (changed & BSS_CHANGED_ARP_FILTER) { | 1993 | if (changed & BSS_CHANGED_ARP_FILTER) { |
1942 | __be32 addr = bss_conf->arp_addr_list[0]; | 1994 | __be32 addr = bss_conf->arp_addr_list[0]; |
1943 | WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS); | 1995 | WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS); |
@@ -2118,14 +2170,14 @@ static struct ieee80211_channel wl1271_channels[] = { | |||
2118 | /* mapping to indexes for wl1271_rates */ | 2170 | /* mapping to indexes for wl1271_rates */ |
2119 | static const u8 wl1271_rate_to_idx_2ghz[] = { | 2171 | static const u8 wl1271_rate_to_idx_2ghz[] = { |
2120 | /* MCS rates are used only with 11n */ | 2172 | /* MCS rates are used only with 11n */ |
2121 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */ | 2173 | 7, /* CONF_HW_RXTX_RATE_MCS7 */ |
2122 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */ | 2174 | 6, /* CONF_HW_RXTX_RATE_MCS6 */ |
2123 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */ | 2175 | 5, /* CONF_HW_RXTX_RATE_MCS5 */ |
2124 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */ | 2176 | 4, /* CONF_HW_RXTX_RATE_MCS4 */ |
2125 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */ | 2177 | 3, /* CONF_HW_RXTX_RATE_MCS3 */ |
2126 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */ | 2178 | 2, /* CONF_HW_RXTX_RATE_MCS2 */ |
2127 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */ | 2179 | 1, /* CONF_HW_RXTX_RATE_MCS1 */ |
2128 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */ | 2180 | 0, /* CONF_HW_RXTX_RATE_MCS0 */ |
2129 | 2181 | ||
2130 | 11, /* CONF_HW_RXTX_RATE_54 */ | 2182 | 11, /* CONF_HW_RXTX_RATE_54 */ |
2131 | 10, /* CONF_HW_RXTX_RATE_48 */ | 2183 | 10, /* CONF_HW_RXTX_RATE_48 */ |
@@ -2148,6 +2200,7 @@ static const u8 wl1271_rate_to_idx_2ghz[] = { | |||
2148 | /* 11n STA capabilities */ | 2200 | /* 11n STA capabilities */ |
2149 | #define HW_RX_HIGHEST_RATE 72 | 2201 | #define HW_RX_HIGHEST_RATE 72 |
2150 | 2202 | ||
2203 | #ifdef CONFIG_WL1271_HT | ||
2151 | #define WL1271_HT_CAP { \ | 2204 | #define WL1271_HT_CAP { \ |
2152 | .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \ | 2205 | .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \ |
2153 | .ht_supported = true, \ | 2206 | .ht_supported = true, \ |
@@ -2159,6 +2212,11 @@ static const u8 wl1271_rate_to_idx_2ghz[] = { | |||
2159 | .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \ | 2212 | .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \ |
2160 | }, \ | 2213 | }, \ |
2161 | } | 2214 | } |
2215 | #else | ||
2216 | #define WL1271_HT_CAP { \ | ||
2217 | .ht_supported = false, \ | ||
2218 | } | ||
2219 | #endif | ||
2162 | 2220 | ||
2163 | /* can't be const, mac80211 writes to this */ | 2221 | /* can't be const, mac80211 writes to this */ |
2164 | static struct ieee80211_supported_band wl1271_band_2ghz = { | 2222 | static struct ieee80211_supported_band wl1271_band_2ghz = { |
@@ -2166,6 +2224,7 @@ static struct ieee80211_supported_band wl1271_band_2ghz = { | |||
2166 | .n_channels = ARRAY_SIZE(wl1271_channels), | 2224 | .n_channels = ARRAY_SIZE(wl1271_channels), |
2167 | .bitrates = wl1271_rates, | 2225 | .bitrates = wl1271_rates, |
2168 | .n_bitrates = ARRAY_SIZE(wl1271_rates), | 2226 | .n_bitrates = ARRAY_SIZE(wl1271_rates), |
2227 | .ht_cap = WL1271_HT_CAP, | ||
2169 | }; | 2228 | }; |
2170 | 2229 | ||
2171 | /* 5 GHz data rates for WL1273 */ | 2230 | /* 5 GHz data rates for WL1273 */ |
@@ -2248,14 +2307,14 @@ static struct ieee80211_channel wl1271_channels_5ghz[] = { | |||
2248 | /* mapping to indexes for wl1271_rates_5ghz */ | 2307 | /* mapping to indexes for wl1271_rates_5ghz */ |
2249 | static const u8 wl1271_rate_to_idx_5ghz[] = { | 2308 | static const u8 wl1271_rate_to_idx_5ghz[] = { |
2250 | /* MCS rates are used only with 11n */ | 2309 | /* MCS rates are used only with 11n */ |
2251 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */ | 2310 | 7, /* CONF_HW_RXTX_RATE_MCS7 */ |
2252 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */ | 2311 | 6, /* CONF_HW_RXTX_RATE_MCS6 */ |
2253 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */ | 2312 | 5, /* CONF_HW_RXTX_RATE_MCS5 */ |
2254 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */ | 2313 | 4, /* CONF_HW_RXTX_RATE_MCS4 */ |
2255 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */ | 2314 | 3, /* CONF_HW_RXTX_RATE_MCS3 */ |
2256 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */ | 2315 | 2, /* CONF_HW_RXTX_RATE_MCS2 */ |
2257 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */ | 2316 | 1, /* CONF_HW_RXTX_RATE_MCS1 */ |
2258 | CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */ | 2317 | 0, /* CONF_HW_RXTX_RATE_MCS0 */ |
2259 | 2318 | ||
2260 | 7, /* CONF_HW_RXTX_RATE_54 */ | 2319 | 7, /* CONF_HW_RXTX_RATE_54 */ |
2261 | 6, /* CONF_HW_RXTX_RATE_48 */ | 2320 | 6, /* CONF_HW_RXTX_RATE_48 */ |
@@ -2280,6 +2339,7 @@ static struct ieee80211_supported_band wl1271_band_5ghz = { | |||
2280 | .n_channels = ARRAY_SIZE(wl1271_channels_5ghz), | 2339 | .n_channels = ARRAY_SIZE(wl1271_channels_5ghz), |
2281 | .bitrates = wl1271_rates_5ghz, | 2340 | .bitrates = wl1271_rates_5ghz, |
2282 | .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz), | 2341 | .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz), |
2342 | .ht_cap = WL1271_HT_CAP, | ||
2283 | }; | 2343 | }; |
2284 | 2344 | ||
2285 | static const u8 *wl1271_band_rate_to_idx[] = { | 2345 | static const u8 *wl1271_band_rate_to_idx[] = { |
diff --git a/drivers/net/wireless/wl12xx/wl1271_rx.c b/drivers/net/wireless/wl12xx/wl1271_rx.c index bea133b6e489..ac13f7d25219 100644 --- a/drivers/net/wireless/wl12xx/wl1271_rx.c +++ b/drivers/net/wireless/wl12xx/wl1271_rx.c | |||
@@ -53,6 +53,12 @@ static void wl1271_rx_status(struct wl1271 *wl, | |||
53 | status->band = wl->band; | 53 | status->band = wl->band; |
54 | status->rate_idx = wl1271_rate_to_idx(wl, desc->rate); | 54 | status->rate_idx = wl1271_rate_to_idx(wl, desc->rate); |
55 | 55 | ||
56 | #ifdef CONFIG_WL1271_HT | ||
57 | /* 11n support */ | ||
58 | if (desc->rate <= CONF_HW_RXTX_RATE_MCS0) | ||
59 | status->flag |= RX_FLAG_HT; | ||
60 | #endif | ||
61 | |||
56 | status->signal = desc->rssi; | 62 | status->signal = desc->rssi; |
57 | 63 | ||
58 | /* | 64 | /* |
diff --git a/drivers/net/wireless/wl12xx/wl1271_tx.c b/drivers/net/wireless/wl12xx/wl1271_tx.c index dc3172bea0dd..87a5aed00c8c 100644 --- a/drivers/net/wireless/wl12xx/wl1271_tx.c +++ b/drivers/net/wireless/wl12xx/wl1271_tx.c | |||
@@ -209,6 +209,17 @@ u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set) | |||
209 | rate_set >>= 1; | 209 | rate_set >>= 1; |
210 | } | 210 | } |
211 | 211 | ||
212 | #ifdef CONFIG_WL1271_HT | ||
213 | /* MCS rates indication are on bits 16 - 23 */ | ||
214 | rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates; | ||
215 | |||
216 | for (bit = 0; bit < 8; bit++) { | ||
217 | if (rate_set & 0x1) | ||
218 | enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit); | ||
219 | rate_set >>= 1; | ||
220 | } | ||
221 | #endif | ||
222 | |||
212 | return enabled_rates; | 223 | return enabled_rates; |
213 | } | 224 | } |
214 | 225 | ||