diff options
author | Shahar Levi <shahar_levi@ti.com> | 2010-10-13 10:09:40 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-11-15 13:25:10 -0500 |
commit | c4db1c879679e795689ef3c9dd7d3f6568ea14c5 (patch) | |
tree | 7723c54d9d496d79b7161589f9025be8f9a7bad1 /drivers/net/wireless/wl12xx/wl1271_acx.c | |
parent | e8b03a2b8debc6056f6f43d24f98f601097301a1 (diff) |
wl1271: 11n Support, ACX Commands
Added ACX command to the FW for 11n support.
Signed-off-by: Shahar Levi <shahar_levi@ti.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1271_acx.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_acx.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_acx.c b/drivers/net/wireless/wl12xx/wl1271_acx.c index 618993405262..bd7f95f4eef3 100644 --- a/drivers/net/wireless/wl12xx/wl1271_acx.c +++ b/drivers/net/wireless/wl12xx/wl1271_acx.c | |||
@@ -1226,6 +1226,89 @@ out: | |||
1226 | return ret; | 1226 | return ret; |
1227 | } | 1227 | } |
1228 | 1228 | ||
1229 | int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, | ||
1230 | struct ieee80211_sta_ht_cap *ht_cap, | ||
1231 | bool allow_ht_operation) | ||
1232 | { | ||
1233 | struct wl1271_acx_ht_capabilities *acx; | ||
1234 | u8 mac_address[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; | ||
1235 | int ret = 0; | ||
1236 | |||
1237 | wl1271_debug(DEBUG_ACX, "acx ht capabilities setting"); | ||
1238 | |||
1239 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | ||
1240 | if (!acx) { | ||
1241 | ret = -ENOMEM; | ||
1242 | goto out; | ||
1243 | } | ||
1244 | |||
1245 | /* Allow HT Operation ? */ | ||
1246 | if (allow_ht_operation) { | ||
1247 | acx->ht_capabilites = | ||
1248 | WL1271_ACX_FW_CAP_HT_OPERATION; | ||
1249 | if (ht_cap->cap & IEEE80211_HT_CAP_GRN_FLD) | ||
1250 | acx->ht_capabilites |= | ||
1251 | WL1271_ACX_FW_CAP_GREENFIELD_FRAME_FORMAT; | ||
1252 | if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20) | ||
1253 | acx->ht_capabilites |= | ||
1254 | WL1271_ACX_FW_CAP_SHORT_GI_FOR_20MHZ_PACKETS; | ||
1255 | if (ht_cap->cap & IEEE80211_HT_CAP_LSIG_TXOP_PROT) | ||
1256 | acx->ht_capabilites |= | ||
1257 | WL1271_ACX_FW_CAP_LSIG_TXOP_PROTECTION; | ||
1258 | |||
1259 | /* get data from A-MPDU parameters field */ | ||
1260 | acx->ampdu_max_length = ht_cap->ampdu_factor; | ||
1261 | acx->ampdu_min_spacing = ht_cap->ampdu_density; | ||
1262 | |||
1263 | memcpy(acx->mac_address, mac_address, ETH_ALEN); | ||
1264 | } else { /* HT operations are not allowed */ | ||
1265 | acx->ht_capabilites = 0; | ||
1266 | } | ||
1267 | |||
1268 | ret = wl1271_cmd_configure(wl, ACX_PEER_HT_CAP, acx, sizeof(*acx)); | ||
1269 | if (ret < 0) { | ||
1270 | wl1271_warning("acx ht capabilities setting failed: %d", ret); | ||
1271 | goto out; | ||
1272 | } | ||
1273 | |||
1274 | out: | ||
1275 | kfree(acx); | ||
1276 | return ret; | ||
1277 | } | ||
1278 | |||
1279 | int wl1271_acx_set_ht_information(struct wl1271 *wl, | ||
1280 | u16 ht_operation_mode) | ||
1281 | { | ||
1282 | struct wl1271_acx_ht_information *acx; | ||
1283 | int ret = 0; | ||
1284 | |||
1285 | wl1271_debug(DEBUG_ACX, "acx ht information setting"); | ||
1286 | |||
1287 | acx = kzalloc(sizeof(*acx), GFP_KERNEL); | ||
1288 | if (!acx) { | ||
1289 | ret = -ENOMEM; | ||
1290 | goto out; | ||
1291 | } | ||
1292 | |||
1293 | acx->ht_protection = | ||
1294 | (u8)(ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION); | ||
1295 | acx->rifs_mode = 0; | ||
1296 | acx->gf_protection = 0; | ||
1297 | acx->ht_tx_burst_limit = 0; | ||
1298 | acx->dual_cts_protection = 0; | ||
1299 | |||
1300 | ret = wl1271_cmd_configure(wl, ACX_HT_BSS_OPERATION, acx, sizeof(*acx)); | ||
1301 | |||
1302 | if (ret < 0) { | ||
1303 | wl1271_warning("acx ht information setting failed: %d", ret); | ||
1304 | goto out; | ||
1305 | } | ||
1306 | |||
1307 | out: | ||
1308 | kfree(acx); | ||
1309 | return ret; | ||
1310 | } | ||
1311 | |||
1229 | int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) | 1312 | int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) |
1230 | { | 1313 | { |
1231 | struct wl1271_acx_fw_tsf_information *tsf_info; | 1314 | struct wl1271_acx_fw_tsf_information *tsf_info; |