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 /drivers/staging/cw1200/ap.c | |
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>
Diffstat (limited to 'drivers/staging/cw1200/ap.c')
-rwxr-xr-x | drivers/staging/cw1200/ap.c | 41 |
1 files changed, 35 insertions, 6 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 ? |