From 744a76525819adfe1b1652d465664e5a380ce29c Mon Sep 17 00:00:00 2001 From: Janusz Dziedzic Date: Fri, 30 Sep 2011 09:47:55 +0200 Subject: cw1200: Switch channel sync Syncing ongoing scan and switch channel request. ST-Ericsson ID: 359760 Change-Id: Ic46eff45fb01b7cb10adcc6b6fc48d2caa85be90 Signed-off-by: Janusz Dziedzic Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32672 Reviewed-by: Bartosz MARKOWSKI Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33667 Tested-by: Dmitry TARNYAGIN Reviewed-by: Philippe LANGLAIS --- drivers/staging/cw1200/scan.c | 3 ++- 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); } } -- cgit v1.2.3