summaryrefslogtreecommitdiff
path: root/drivers/staging/cw1200/ap.c
diff options
context:
space:
mode:
authorLukasz Kucharczyk <lukasz.kucharczyk@tieto.com>2012-02-29 15:14:53 +0100
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:06:43 +0200
commitce0fce4d8b7df2332fa3ed8323f9c6378c2376ea (patch)
treea0b8f01636b45af7a4b18edd806c7c2ea20a874c /drivers/staging/cw1200/ap.c
parentcf1aa19048fba67a8dcdf9b2f1164cbb10c5c8b4 (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-xdrivers/staging/cw1200/ap.c41
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 ?