summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>2011-09-30 09:47:55 +0200
committerPhilippe LANGLAIS <philippe.langlais@stericsson.com>2011-10-13 10:25:38 +0200
commit744a76525819adfe1b1652d465664e5a380ce29c (patch)
tree0952d086a75a32c945fca2327f2c214dcddab170
parent7a2de54ab4a67e97bc1a4fac9b84eb6c307f9488 (diff)
cw1200: Switch channel sync
Syncing ongoing scan and switch channel request. ST-Ericsson ID: 359760 Change-Id: Ic46eff45fb01b7cb10adcc6b6fc48d2caa85be90 Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32672 Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33667 Tested-by: Dmitry TARNYAGIN <dmitry.tarnyagin@stericsson.com> Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
-rw-r--r--drivers/staging/cw1200/scan.c3
-rw-r--r--drivers/staging/cw1200/sta.c28
2 files changed, 24 insertions, 7 deletions
diff --git a/drivers/staging/cw1200/scan.c b/drivers/staging/cw1200/scan.c
index 11de0db44de..568782eb0c9 100644
--- a/drivers/staging/cw1200/scan.c
+++ b/drivers/staging/cw1200/scan.c
@@ -364,11 +364,13 @@ void cw1200_probe_work(struct work_struct *work)
return;
}
+ mutex_lock(&priv->conf_mutex);
if (unlikely(down_trylock(&priv->scan.lock))) {
/* Scan is already in progress. Requeue self. */
schedule();
queue_delayed_work(priv->workqueue,
&priv->scan.probe_work, HZ / 10);
+ mutex_unlock(&priv->conf_mutex);
return;
}
@@ -403,7 +405,6 @@ void cw1200_probe_work(struct work_struct *work)
}
}
- mutex_lock(&priv->conf_mutex);
/* FW bug: driver has to restart p2p-dev mode after scan */
if (priv->join_status == CW1200_JOIN_STATUS_MONITOR)
cw1200_disable_listening(priv);
diff --git a/drivers/staging/cw1200/sta.c b/drivers/staging/cw1200/sta.c
index 908294c8a93..9eb7879bab2 100644
--- a/drivers/staging/cw1200/sta.c
+++ b/drivers/staging/cw1200/sta.c
@@ -287,17 +287,33 @@ int cw1200_config(struct ieee80211_hw *dev, u32 changed)
cw1200_cancel_scan(priv);
sta_printk(KERN_DEBUG "[STA] Freq %d (wsm ch: %d).\n",
ch->center_freq, ch->hw_value);
- WARN_ON(wait_event_timeout(
- priv->channel_switch_done,
- !priv->channel_switch_in_progress, 3 * HZ) <= 0);
ret = WARN_ON(__cw1200_flush(priv, false));
if (!ret) {
+ while(down_trylock(&priv->scan.lock)) {
+ sta_printk(KERN_DEBUG "[STA] waiting, "
+ "scan in progress.\n");
+ msleep(100);
+ }
+
ret = WARN_ON(wsm_switch_channel(priv, &channel));
- if (!ret)
- priv->channel = ch;
- else
+ if (!ret) {
+ ret = wait_event_timeout(
+ priv->channel_switch_done,
+ !priv->channel_switch_in_progress,
+ 3 * HZ);
+ /* TODO: We should check also switch channel
+ * complete indication
+ */
+ if (ret) {
+ priv->channel = ch;
+ ret = 0;
+ } else
+ ret = -ETIMEDOUT;
+ } else
wsm_unlock_tx(priv);
+
+ up(&priv->scan.lock);
}
}