diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2012-02-29 15:14:29 +0100 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:06:39 +0200 |
commit | 74ce5fb12b483f13663096a5d317c73cb99ea6da (patch) | |
tree | 56a62ad959156d092395e9b2f0653ceee4a21dd5 | |
parent | da3d13a635111dc6e9d0f69ff55fc06ce329d0b7 (diff) |
cw1200: Enable Block ACK only for 11n BSS.
Driver tried to setup Block ACK not taking in account
11n capabilities of the BSS. It even tried to setup
Block ACK for legacy 11g BSSes.
Patch checks HT status of the current connection before
enabling Block ACK.
ST-Ericsson ID: 369354
Change-Id: I11515c4d70dbb572b1e2da6749ba123c3ca71751
Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/36608
Reviewed-by: QABUILD
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
-rwxr-xr-x | drivers/staging/cw1200/ap.c | 8 | ||||
-rw-r--r-- | drivers/staging/cw1200/main.c | 14 | ||||
-rw-r--r-- | drivers/staging/cw1200/sta.c | 7 |
3 files changed, 16 insertions, 13 deletions
diff --git a/drivers/staging/cw1200/ap.c b/drivers/staging/cw1200/ap.c index f328cff389e..25612eba1ca 100755 --- a/drivers/staging/cw1200/ap.c +++ b/drivers/staging/cw1200/ap.c @@ -457,6 +457,14 @@ void cw1200_bss_info_changed(struct ieee80211_hw *dev, priv->setbssparams_done = true; WARN_ON(wsm_set_beacon_wakeup_period(priv, dtim_interval, listen_interval)); + if (sta && cw1200_is_ht(&priv->ht_info)) { + ap_printk(KERN_DEBUG + "[STA] Enabling Block ACK\n"); + WARN_ON(wsm_set_block_ack_policy(priv, + priv->ba_tid_mask, + priv->ba_tid_mask)); + } + cw1200_set_pm(priv, &priv->powersave_mode); if (priv->is_BT_Present) diff --git a/drivers/staging/cw1200/main.c b/drivers/staging/cw1200/main.c index e57519aa3fb..c8eb01b94e1 100644 --- a/drivers/staging/cw1200/main.c +++ b/drivers/staging/cw1200/main.c @@ -158,11 +158,8 @@ static struct ieee80211_supported_band cw1200_band_2ghz = { .bitrates = cw1200_g_rates, .n_bitrates = cw1200_g_rates_size, .ht_cap = { - .cap = IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_GRN_FLD | - /* HT Rx STBC: Rx support of one spatial stream */ - 0x0100 | - IEEE80211_HT_CAP_DELAY_BA | + .cap = IEEE80211_HT_CAP_GRN_FLD | + (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT) | IEEE80211_HT_CAP_MAX_AMSDU, .ht_supported = 1, .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, @@ -182,11 +179,8 @@ static struct ieee80211_supported_band cw1200_band_5ghz = { .bitrates = cw1200_a_rates, .n_bitrates = cw1200_a_rates_size, .ht_cap = { - .cap = IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_GRN_FLD | - /* HT Rx STBC: Rx support of one spatial stream */ - 0x0100 | - IEEE80211_HT_CAP_DELAY_BA | + .cap = IEEE80211_HT_CAP_GRN_FLD | + (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT) | IEEE80211_HT_CAP_MAX_AMSDU, .ht_supported = 1, .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, diff --git a/drivers/staging/cw1200/sta.c b/drivers/staging/cw1200/sta.c index dd227bec2a3..bac6fa6a6a2 100644 --- a/drivers/staging/cw1200/sta.c +++ b/drivers/staging/cw1200/sta.c @@ -1279,6 +1279,9 @@ void cw1200_join_work(struct work_struct *work) &priv->join_timeout, 3 * HZ); cw1200_update_listening(priv, false); + /* BlockACK policy will be updated when assoc is done */ + WARN_ON(wsm_set_block_ack_policy(priv, + 0, 0)); if (wsm_join(priv, &join)) { memset(&priv->join_bssid[0], 0, sizeof(priv->join_bssid)); @@ -1291,8 +1294,6 @@ void cw1200_join_work(struct work_struct *work) cw1200_queue_requeue(queue, priv->pending_frame_id); priv->join_status = CW1200_JOIN_STATUS_STA; } - WARN_ON(wsm_set_block_ack_policy(priv, - priv->ba_tid_mask, priv->ba_tid_mask)); cw1200_update_filtering(priv); } mutex_unlock(&priv->conf_mutex); @@ -1355,7 +1356,7 @@ void cw1200_unjoin_work(struct work_struct *work) cancel_delayed_work_sync(&priv->connection_loss_work); cw1200_update_listening(priv, priv->listening); WARN_ON(wsm_set_block_ack_policy(priv, - priv->ba_tid_mask, priv->ba_tid_mask)); + 0, 0)); cw1200_update_filtering(priv); priv->setbssparams_done = false; memset(&priv->association_mode, 0, |