diff options
author | Janusz Dziedzic <janusz.dziedzic@tieto.com> | 2011-09-30 09:47:55 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-12-06 11:00:36 +0100 |
commit | 032c7554976fd8d02f2c91440de69c7a89587ab5 (patch) | |
tree | f1baf86bb118c289b2c98e4279c11f04d3df476d | |
parent | d7878c2068b0449a270cfd27c04f20da61ec3ea5 (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.c | 3 | ||||
-rw-r--r-- | drivers/staging/cw1200/sta.c | 28 |
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); } } |