From: "Arend van Spriel" <arend@broadcom.com>
To: gregkh@suse.de
Cc: devel@linuxdriverproject.org, linux-wireless@vger.kernel.org,
"Arend van Spriel" <arend@broadcom.com>
Subject: [PATCH 01/14] staging: brcm80211: use wait queues instead of semaphores in wl_cfg80211.c
Date: Fri, 12 Aug 2011 15:34:48 +0200 [thread overview]
Message-ID: <1313156101-16817-2-git-send-email-arend@broadcom.com> (raw)
In-Reply-To: <1313156101-16817-1-git-send-email-arend@broadcom.com>
In wl_cfg80211.c two semaphores were used to trigger a task to process
an event. The wait queues are better suited for that purpose. This also
removes checkpatch warning on sema_init() calls in this source file.
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c | 49 +++++++++++++++-------
drivers/staging/brcm80211/brcmfmac/wl_cfg80211.h | 5 +-
2 files changed, 36 insertions(+), 18 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
index bc1e1a9..833defb 100644
--- a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
@@ -3162,7 +3162,7 @@ static void brcmf_deinit_priv_mem(struct brcmf_cfg80211_priv *cfg_priv)
static s32 brcmf_create_event_handler(struct brcmf_cfg80211_priv *cfg_priv)
{
- sema_init(&cfg_priv->event_sync, 0);
+ init_waitqueue_head(&cfg_priv->event_waitq);
cfg_priv->event_tsk = kthread_run(brcmf_event_handler, cfg_priv,
"wl_event_handler");
if (IS_ERR(cfg_priv->event_tsk)) {
@@ -3224,7 +3224,7 @@ static s32 brcmf_wakeup_iscan(struct brcmf_cfg80211_iscan_ctrl *iscan)
{
if (likely(iscan->state != WL_ISCAN_STATE_IDLE)) {
WL_SCAN("wake up iscan\n");
- up(&iscan->sync);
+ wake_up(&iscan->waitq);
return 0;
}
@@ -3330,13 +3330,19 @@ static s32 brcmf_iscan_thread(void *data)
(struct brcmf_cfg80211_iscan_ctrl *)data;
struct brcmf_cfg80211_priv *cfg_priv = iscan_to_cfg(iscan);
struct brcmf_cfg80211_iscan_eloop *el = &iscan->el;
+ DECLARE_WAITQUEUE(wait, current);
u32 status;
int err = 0;
sched_setscheduler(current, SCHED_FIFO, ¶m);
allow_signal(SIGTERM);
status = BRCMF_SCAN_RESULTS_PARTIAL;
- while (likely(!down_interruptible(&iscan->sync))) {
+ add_wait_queue(&iscan->waitq, &wait);
+ while (1) {
+ prepare_to_wait(&iscan->waitq, &wait, TASK_INTERRUPTIBLE);
+
+ schedule();
+
if (kthread_should_stop())
break;
if (iscan->timer_on) {
@@ -3353,6 +3359,7 @@ static s32 brcmf_iscan_thread(void *data)
rtnl_unlock();
el->handler[status](cfg_priv);
}
+ finish_wait(&iscan->waitq, &wait);
if (iscan->timer_on) {
del_timer_sync(&iscan->timer);
iscan->timer_on = 0;
@@ -3380,7 +3387,7 @@ static s32 brcmf_invoke_iscan(struct brcmf_cfg80211_priv *cfg_priv)
if (cfg_priv->iscan_on && !iscan->tsk) {
iscan->state = WL_ISCAN_STATE_IDLE;
- sema_init(&iscan->sync, 0);
+ init_waitqueue_head(&iscan->waitq);
iscan->tsk = kthread_run(brcmf_iscan_thread, iscan, "wl_iscan");
if (IS_ERR(iscan->tsk)) {
WL_ERR("Could not create iscan thread\n");
@@ -3528,7 +3535,7 @@ void brcmf_cfg80211_detach(void)
static void brcmf_wakeup_event(struct brcmf_cfg80211_priv *cfg_priv)
{
- up(&cfg_priv->event_sync);
+ wake_up(&cfg_priv->event_waitq);
}
static s32 brcmf_event_handler(void *data)
@@ -3537,27 +3544,39 @@ static s32 brcmf_event_handler(void *data)
(struct brcmf_cfg80211_priv *)data;
struct sched_param param = {.sched_priority = MAX_RT_PRIO - 1 };
struct brcmf_cfg80211_event_q *e;
+ DECLARE_WAITQUEUE(wait, current);
sched_setscheduler(current, SCHED_FIFO, ¶m);
allow_signal(SIGTERM);
- while (likely(!down_interruptible(&cfg_priv->event_sync))) {
+ add_wait_queue(&cfg_priv->event_waitq, &wait);
+ while (1) {
+ prepare_to_wait(&cfg_priv->event_waitq, &wait,
+ TASK_INTERRUPTIBLE);
+
+ schedule();
+
if (kthread_should_stop())
break;
+
e = brcmf_deq_event(cfg_priv);
if (unlikely(!e)) {
WL_ERR("event queue empty...\n");
- BUG();
+ continue;
}
- WL_INFO("event type (%d)\n", e->etype);
- if (cfg_priv->el.handler[e->etype])
- cfg_priv->el.handler[e->etype](cfg_priv,
- cfg_to_ndev(cfg_priv),
- &e->emsg, e->edata);
- else
- WL_INFO("Unknown Event (%d): ignoring\n", e->etype);
- brcmf_put_event(e);
+ do {
+ WL_INFO("event type (%d)\n", e->etype);
+ if (cfg_priv->el.handler[e->etype])
+ cfg_priv->el.handler[e->etype](cfg_priv,
+ cfg_to_ndev(cfg_priv),
+ &e->emsg, e->edata);
+ else
+ WL_INFO("Unknown Event (%d): ignoring\n",
+ e->etype);
+ brcmf_put_event(e);
+ } while ((e = brcmf_deq_event(cfg_priv)));
}
+ finish_wait(&cfg_priv->event_waitq, &wait);
WL_INFO("was terminated\n");
return 0;
}
diff --git a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.h
index ff5c19a..049138b 100644
--- a/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.h
+++ b/drivers/staging/brcm80211/brcmfmac/wl_cfg80211.h
@@ -249,7 +249,7 @@ struct brcmf_cfg80211_iscan_ctrl {
u32 timer_on;
s32 state;
struct task_struct *tsk;
- struct semaphore sync;
+ wait_queue_head_t waitq;
struct brcmf_cfg80211_iscan_eloop el;
void *data;
s8 ioctl_buf[BRCMF_C_IOCTL_SMLEN];
@@ -295,13 +295,12 @@ struct brcmf_cfg80211_priv {
cfg80211 layer */
struct brcmf_cfg80211_ie ie; /* information element object for
internal purpose */
- struct semaphore event_sync; /* for synchronization of main event
- thread */
struct brcmf_cfg80211_profile *profile; /* holding dongle profile */
struct brcmf_cfg80211_iscan_ctrl *iscan; /* iscan controller */
struct brcmf_cfg80211_connect_info conn_info; /* association info */
struct brcmf_cfg80211_pmk_list *pmk_list; /* wpa2 pmk list */
struct task_struct *event_tsk; /* task of main event handler thread */
+ wait_queue_head_t event_waitq; /* wait queue for main event handling */
unsigned long status; /* current dongle status */
void *pub;
u32 channel; /* current channel */
--
1.7.4.1
next prev parent reply other threads:[~2011-08-12 13:35 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-12 13:34 [PATCH 00/14] staging: brcm80211: brcmfmac driver cleanup Arend van Spriel
2011-08-12 13:34 ` Arend van Spriel [this message]
2011-08-12 14:07 ` [PATCH 01/14] staging: brcm80211: use wait queues instead of semaphores in wl_cfg80211.c Rafał Miłecki
2011-08-12 16:44 ` Arend van Spriel
2011-08-12 18:55 ` Arend van Spriel
2011-08-12 18:59 ` Johannes Berg
2011-08-12 18:59 ` Franky Lin
2011-08-12 19:08 ` Larry Finger
2011-08-12 19:10 ` Arend van Spriel
2011-08-16 20:27 ` Rafał Miłecki
2011-08-12 19:05 ` [PATCHv2 " Arend van Spriel
2011-08-12 19:07 ` Arend van Spriel
2011-08-12 19:09 ` Arend van Spriel
2011-08-16 17:56 ` Dan Carpenter
2011-08-12 13:34 ` [PATCH 02/14] staging: brcm80211: remove iovar IOV_BLOCKSIZE in brcmfmac Arend van Spriel
2011-08-12 14:12 ` Rafał Miłecki
2011-08-12 16:37 ` Arend van Spriel
2011-08-12 20:02 ` Rafał Miłecki
2011-08-12 13:34 ` [PATCH 03/14] staging: brcm80211: remove struct sdioh_info from brcmfmac Arend van Spriel
2011-08-12 13:34 ` [PATCH 04/14] staging: brcm80211: remove global var gInstance " Arend van Spriel
2011-08-12 13:34 ` [PATCH 05/14] staging: brcm80211: remove wext traces in fullmac Arend van Spriel
2011-08-12 13:34 ` [PATCH 06/14] staging: brcm80211: absorb brcmf_sdioh_iovar_op into brcmf_sdcard_iovar_op Arend van Spriel
2011-08-12 13:34 ` [PATCH 07/14] staging: brcm80211: absorb brcmf_sdioh_interrupt_register into brcmf_sdcard_intr_reg Arend van Spriel
2011-08-12 14:31 ` Rafał Miłecki
2011-08-12 13:34 ` [PATCH 08/14] staging: brcm80211: absorb brcmf_sdioh_interrupt_deregister into brcmf_sdcard_intr_dereg Arend van Spriel
2011-08-12 13:34 ` [PATCH 09/14] staging: brcm80211: absorb brcmf_sdioh_abort into brcmf_sdcard_abort Arend van Spriel
2011-08-12 13:34 ` [PATCH 10/14] staging: brcm80211: remove dead code from dhd_sdio.c Arend van Spriel
2011-08-12 13:34 ` [PATCH 11/14] staging: brcm80211: remove wrapper functions in bcmsdh_sdmmc.c Arend van Spriel
2011-08-12 13:34 ` [PATCH 12/14] staging: brcm80211: remove unused parameter from data interface in fullmac Arend van Spriel
2011-08-12 13:35 ` [PATCH 13/14] staging: brcm80211: remove dead SDTEST code from fullmac Arend van Spriel
2011-08-12 13:35 ` [PATCH 14/14] staging: brcm80211: remove unused func parameter in wl_cfg80211 of fullmac Arend van Spriel
2011-08-12 14:02 ` [PATCH 00/14] staging: brcm80211: brcmfmac driver cleanup Rafał Miłecki
2011-08-12 15:14 ` Hauke Mehrtens
2011-08-12 15:43 ` Rafał Miłecki
2011-08-12 16:32 ` Arend van Spriel
2011-08-12 20:04 ` Rafał Miłecki
2011-08-13 7:47 ` Arend van Spriel
2011-08-13 8:30 ` Rafał Miłecki
2011-08-26 9:20 ` Rafał Miłecki
2011-08-26 17:31 ` Henry Ptasinski
2011-08-26 17:38 ` Jason
2011-08-26 17:44 ` Henry Ptasinski
2011-08-26 20:00 ` Jason
2011-08-26 20:15 ` Henry Ptasinski
2011-08-23 20:07 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1313156101-16817-2-git-send-email-arend@broadcom.com \
--to=arend@broadcom.com \
--cc=devel@linuxdriverproject.org \
--cc=gregkh@suse.de \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).