summaryrefslogtreecommitdiff
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
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>
-rwxr-xr-xdrivers/staging/cw1200/ap.c41
-rw-r--r--drivers/staging/cw1200/ap.h1
-rw-r--r--drivers/staging/cw1200/cw1200.h2
-rw-r--r--drivers/staging/cw1200/main.c1
-rw-r--r--drivers/staging/cw1200/sta.c6
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);