diff options
author | Lukasz Kucharczyk <lukasz.kucharczyk@tieto.com> | 2012-02-29 15:14:53 +0100 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:06:43 +0200 |
commit | ce0fce4d8b7df2332fa3ed8323f9c6378c2376ea (patch) | |
tree | a0b8f01636b45af7a4b18edd806c7c2ea20a874c | |
parent | cf1aa19048fba67a8dcdf9b2f1164cbb10c5c8b4 (diff) |
cw1200: enable non-ERP protection.
Non-ERP protection is enabled and relevant bit
is set in ERP information element upon detection
of non-ERP station nearby.
ST-Ericsson ID: 374909
Depends-on: I16ca7675d47361246145c7924af4c6fe3601f9ab
Depends-on: Ib788fdcb89b14e8ae0f20f8bf1da9b625c4912b8
Change-Id: Ie1932612e52d6ba26882f30bb45211202cab1393
Signed-off-by: Lukasz Kucharczyk <lukasz.kucharczyk@tieto.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/39121
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
-rwxr-xr-x | drivers/staging/cw1200/ap.c | 41 | ||||
-rw-r--r-- | drivers/staging/cw1200/ap.h | 1 | ||||
-rw-r--r-- | drivers/staging/cw1200/cw1200.h | 2 | ||||
-rw-r--r-- | drivers/staging/cw1200/main.c | 1 | ||||
-rw-r--r-- | drivers/staging/cw1200/sta.c | 6 |
5 files changed, 44 insertions, 7 deletions
diff --git a/drivers/staging/cw1200/ap.c b/drivers/staging/cw1200/ap.c index 5b5e5094953..f58ccb13205 100755 --- a/drivers/staging/cw1200/ap.c +++ b/drivers/staging/cw1200/ap.c @@ -213,6 +213,38 @@ int cw1200_set_tim(struct ieee80211_hw *dev, struct ieee80211_sta *sta, return 0; } +void cw1200_set_cts_work(struct work_struct *work) +{ + struct cw1200_common *priv = + container_of(work, struct cw1200_common, set_cts_work.work); + + struct ieee80211_mgmt *mgmt; + u8 erp_ie[3] = {WLAN_EID_ERP_INFO, 0x1, 0}; + struct wsm_update_ie update_ie = { + .what = WSM_UPDATE_IE_BEACON, + .count = 1, + .ies = erp_ie, + .length = 3, + }; + __le32 use_cts_prot = priv->use_cts_prot ? + __cpu_to_le32(1) : 0; + + mutex_lock(&priv->conf_mutex); + if (priv->use_cts_prot) + erp_ie[ERP_INFO_BYTE_OFFSET] |= WLAN_ERP_USE_PROTECTION; + else + erp_ie[ERP_INFO_BYTE_OFFSET] &= ~(WLAN_ERP_USE_PROTECTION); + mutex_unlock(&priv->conf_mutex); + + ap_printk(KERN_DEBUG "[STA] CTS protection %d\n", use_cts_prot); + + WARN_ON(wsm_write_mib(priv, WSM_MIB_ID_NON_ERP_PROTECTION, + &use_cts_prot, sizeof(use_cts_prot))); + WARN_ON(wsm_update_ie(priv, &update_ie)); + + return; +} + static int cw1200_set_btcoexinfo(struct cw1200_common *priv) { struct wsm_override_internal_txrate arg; @@ -495,13 +527,10 @@ void cw1200_bss_info_changed(struct ieee80211_hw *dev, } } if (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_ERP_CTS_PROT)) { - __le32 use_cts_prot = info->use_cts_prot ? - __cpu_to_le32(1) : 0; - ap_printk(KERN_DEBUG "[STA] CTS protection %d\n", - info->use_cts_prot); - WARN_ON(wsm_write_mib(priv, WSM_MIB_ID_NON_ERP_PROTECTION, - &use_cts_prot, sizeof(use_cts_prot))); + priv->use_cts_prot = info->use_cts_prot; + + queue_delayed_work(priv->workqueue, &priv->set_cts_work, 0*HZ); } if (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_ERP_SLOT)) { __le32 slot_time = info->use_short_slot ? diff --git a/drivers/staging/cw1200/ap.h b/drivers/staging/cw1200/ap.h index a9e85bd5516..2175a82d2a2 100644 --- a/drivers/staging/cw1200/ap.h +++ b/drivers/staging/cw1200/ap.h @@ -34,6 +34,7 @@ int cw1200_ampdu_action(struct ieee80211_hw *hw, void cw1200_suspend_resume(struct cw1200_common *priv, struct wsm_suspend_resume *arg); void cw1200_set_tim_work(struct work_struct *work); +void cw1200_set_cts_work(struct work_struct *work); void cw1200_multicast_start_work(struct work_struct *work); void cw1200_multicast_stop_work(struct work_struct *work); void cw1200_mcast_timeout(unsigned long arg); diff --git a/drivers/staging/cw1200/cw1200.h b/drivers/staging/cw1200/cw1200.h index a1a93ecfaf7..0bdd3a65406 100644 --- a/drivers/staging/cw1200/cw1200.h +++ b/drivers/staging/cw1200/cw1200.h @@ -155,6 +155,7 @@ struct cw1200_common { bool is_BT_Present; u8 conf_listen_interval; u32 listen_interval; + u32 use_cts_prot; /* BH */ atomic_t bh_rx; @@ -217,6 +218,7 @@ struct cw1200_common { bool buffered_multicasts; bool tx_multicast; struct work_struct set_tim_work; + struct delayed_work set_cts_work; struct work_struct multicast_start_work; struct work_struct multicast_stop_work; struct timer_list mcast_timeout; diff --git a/drivers/staging/cw1200/main.c b/drivers/staging/cw1200/main.c index 0585f3dea9a..4081a3d4fe2 100644 --- a/drivers/staging/cw1200/main.c +++ b/drivers/staging/cw1200/main.c @@ -338,6 +338,7 @@ struct ieee80211_hw *cw1200_init_common(size_t priv_data_len) spin_lock_init(&priv->bss_loss_lock); INIT_WORK(&priv->tx_failure_work, cw1200_tx_failure_work); spin_lock_init(&priv->ps_state_lock); + INIT_DELAYED_WORK(&priv->set_cts_work, cw1200_set_cts_work); INIT_WORK(&priv->set_tim_work, cw1200_set_tim_work); INIT_WORK(&priv->multicast_start_work, cw1200_multicast_start_work); INIT_WORK(&priv->multicast_stop_work, cw1200_multicast_stop_work); diff --git a/drivers/staging/cw1200/sta.c b/drivers/staging/cw1200/sta.c index 33856e6fc43..5f431a0e2de 100644 --- a/drivers/staging/cw1200/sta.c +++ b/drivers/staging/cw1200/sta.c @@ -74,7 +74,7 @@ int cw1200_start(struct ieee80211_hw *dev) priv->cqm_beacon_loss_count = 20; /* Temporary configuration - beacon filter table */ - priv->bf_table.numOfIEs = __cpu_to_le32(1); + priv->bf_table.numOfIEs = __cpu_to_le32(2); priv->bf_table.entry[0].ieId = WLAN_EID_VENDOR_SPECIFIC; priv->bf_table.entry[0].actionFlags = WSM_BEACON_FILTER_IE_HAS_CHANGED | WSM_BEACON_FILTER_IE_NO_LONGER_PRESENT | @@ -82,6 +82,10 @@ int cw1200_start(struct ieee80211_hw *dev) priv->bf_table.entry[0].oui[0] = 0x50; priv->bf_table.entry[0].oui[1] = 0x6F; priv->bf_table.entry[0].oui[2] = 0x9A; + priv->bf_table.entry[1].ieId = WLAN_EID_ERP_INFO; + priv->bf_table.entry[1].actionFlags = WSM_BEACON_FILTER_IE_HAS_CHANGED | + WSM_BEACON_FILTER_IE_NO_LONGER_PRESENT | + WSM_BEACON_FILTER_IE_HAS_APPEARED; priv->bf_control.enabled = 1; ret = cw1200_setup_mac(priv); |