diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2009-06-12 15:37:31 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-06-15 15:05:52 -0400 |
commit | 87e501b351ed9d837e63f6506b7e66331a69ed58 (patch) | |
tree | 7dad95c4413bff47f6f7de41b1e656d989157a47 /drivers | |
parent | b3781c74373489fa325ce64efdf72f6c8567b783 (diff) |
net/libertas: don't recursive spin lock in if_spi_e2h()
|BUG: spinlock recursion on CPU#0, lbs_spi_thread/1030
| lock: dee9a1bc, .magic: dead4ead, .owner: lbs_spi_thread/1030, .owner_cpu: 0
|Call Trace:
|[deec3eb0] [c0007220] show_stack+0x4c/0x15c (unreliable)
|[deec3ef0] [c0187720] spin_bug+0x9c/0xb0
|[deec3f10] [c0187890] _raw_spin_lock+0x54/0x148
|[deec3f40] [c02d260c] _spin_lock_irqsave+0x2c/0x44
|[deec3f60] [e8671800] lbs_queue_event+0x7c/0x130 [libertas]
|[deec3f80] [e8725f04] lbs_spi_thread+0x538/0x58c [libertas_spi]
|[deec3fe0] [c004f270] kthread+0x4c/0x88
|[deec3ff0] [c000f33c] kernel_thread+0x4c/0x68
if_spi_e2h() is grabbing ->driver_lock just while calling
lbs_queue_event() which is grabbing the same lock.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/libertas/if_spi.c | 4 |
1 files changed, 0 insertions, 4 deletions
diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c index dc2a1f6ee36c..923ed58d58e7 100644 --- a/drivers/net/wireless/libertas/if_spi.c +++ b/drivers/net/wireless/libertas/if_spi.c | |||
@@ -812,7 +812,6 @@ out: | |||
812 | static void if_spi_e2h(struct if_spi_card *card) | 812 | static void if_spi_e2h(struct if_spi_card *card) |
813 | { | 813 | { |
814 | int err = 0; | 814 | int err = 0; |
815 | unsigned long flags; | ||
816 | u32 cause; | 815 | u32 cause; |
817 | struct lbs_private *priv = card->priv; | 816 | struct lbs_private *priv = card->priv; |
818 | 817 | ||
@@ -827,10 +826,7 @@ static void if_spi_e2h(struct if_spi_card *card) | |||
827 | /* generate a card interrupt */ | 826 | /* generate a card interrupt */ |
828 | spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, IF_SPI_CIC_HOST_EVENT); | 827 | spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, IF_SPI_CIC_HOST_EVENT); |
829 | 828 | ||
830 | spin_lock_irqsave(&priv->driver_lock, flags); | ||
831 | lbs_queue_event(priv, cause & 0xff); | 829 | lbs_queue_event(priv, cause & 0xff); |
832 | spin_unlock_irqrestore(&priv->driver_lock, flags); | ||
833 | |||
834 | out: | 830 | out: |
835 | if (err) | 831 | if (err) |
836 | lbs_pr_err("%s: error %d\n", __func__, err); | 832 | lbs_pr_err("%s: error %d\n", __func__, err); |