diff options
-rw-r--r-- | drivers/net/wireless/cw1200/cw1200_spi.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/wireless/cw1200/cw1200_spi.c b/drivers/net/wireless/cw1200/cw1200_spi.c index c31580ba883b..f5e6b489ed32 100644 --- a/drivers/net/wireless/cw1200/cw1200_spi.c +++ b/drivers/net/wireless/cw1200/cw1200_spi.c | |||
@@ -40,6 +40,7 @@ struct hwbus_priv { | |||
40 | struct cw1200_common *core; | 40 | struct cw1200_common *core; |
41 | const struct cw1200_platform_data_spi *pdata; | 41 | const struct cw1200_platform_data_spi *pdata; |
42 | spinlock_t lock; /* Serialize all bus operations */ | 42 | spinlock_t lock; /* Serialize all bus operations */ |
43 | wait_queue_head_t wq; | ||
43 | int claimed; | 44 | int claimed; |
44 | int irq_disabled; | 45 | int irq_disabled; |
45 | }; | 46 | }; |
@@ -198,8 +199,11 @@ static void cw1200_spi_lock(struct hwbus_priv *self) | |||
198 | { | 199 | { |
199 | unsigned long flags; | 200 | unsigned long flags; |
200 | 201 | ||
202 | DECLARE_WAITQUEUE(wait, current); | ||
203 | |||
201 | might_sleep(); | 204 | might_sleep(); |
202 | 205 | ||
206 | add_wait_queue(&self->wq, &wait); | ||
203 | spin_lock_irqsave(&self->lock, flags); | 207 | spin_lock_irqsave(&self->lock, flags); |
204 | while (1) { | 208 | while (1) { |
205 | set_current_state(TASK_UNINTERRUPTIBLE); | 209 | set_current_state(TASK_UNINTERRUPTIBLE); |
@@ -212,6 +216,7 @@ static void cw1200_spi_lock(struct hwbus_priv *self) | |||
212 | set_current_state(TASK_RUNNING); | 216 | set_current_state(TASK_RUNNING); |
213 | self->claimed = 1; | 217 | self->claimed = 1; |
214 | spin_unlock_irqrestore(&self->lock, flags); | 218 | spin_unlock_irqrestore(&self->lock, flags); |
219 | remove_wait_queue(&self->wq, &wait); | ||
215 | 220 | ||
216 | return; | 221 | return; |
217 | } | 222 | } |
@@ -223,6 +228,8 @@ static void cw1200_spi_unlock(struct hwbus_priv *self) | |||
223 | spin_lock_irqsave(&self->lock, flags); | 228 | spin_lock_irqsave(&self->lock, flags); |
224 | self->claimed = 0; | 229 | self->claimed = 0; |
225 | spin_unlock_irqrestore(&self->lock, flags); | 230 | spin_unlock_irqrestore(&self->lock, flags); |
231 | wake_up(&self->wq); | ||
232 | |||
226 | return; | 233 | return; |
227 | } | 234 | } |
228 | 235 | ||
@@ -413,6 +420,8 @@ static int cw1200_spi_probe(struct spi_device *func) | |||
413 | 420 | ||
414 | spi_set_drvdata(func, self); | 421 | spi_set_drvdata(func, self); |
415 | 422 | ||
423 | init_waitqueue_head(&self->wq); | ||
424 | |||
416 | status = cw1200_spi_irq_subscribe(self); | 425 | status = cw1200_spi_irq_subscribe(self); |
417 | 426 | ||
418 | status = cw1200_core_probe(&cw1200_spi_hwbus_ops, | 427 | status = cw1200_core_probe(&cw1200_spi_hwbus_ops, |