diff options
author | Franky Lin <frankyl@broadcom.com> | 2012-09-13 15:11:59 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-09-24 14:59:08 -0400 |
commit | 1d38227371d8db7d58b4f870192dd944f73f4352 (patch) | |
tree | 1583c3b467cb83e84ac31d537dbb3b80b9b1a459 /drivers/net/wireless/brcm80211 | |
parent | 86761fcbea8a779b0aa2af120173cd4ef7edd72f (diff) |
brcmfmac: use atomic variable for interrupt pending flag
Interrupt pending flag used in SDIO bus layer could be used in
multiple processes in different context. Use atomic_t make sure
every interrupt is handled.
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index 2ca9e8c179c..b0794e856a0 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
@@ -531,7 +531,7 @@ struct brcmf_sdio { | |||
531 | 531 | ||
532 | bool intr; /* Use interrupts */ | 532 | bool intr; /* Use interrupts */ |
533 | bool poll; /* Use polling */ | 533 | bool poll; /* Use polling */ |
534 | bool ipend; /* Device interrupt is pending */ | 534 | atomic_t ipend; /* Device interrupt is pending */ |
535 | uint spurious; /* Count of spurious interrupts */ | 535 | uint spurious; /* Count of spurious interrupts */ |
536 | uint pollrate; /* Ticks between device polls */ | 536 | uint pollrate; /* Ticks between device polls */ |
537 | uint polltick; /* Tick counter */ | 537 | uint polltick; /* Tick counter */ |
@@ -2151,7 +2151,7 @@ static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes) | |||
2151 | if (ret != 0) | 2151 | if (ret != 0) |
2152 | break; | 2152 | break; |
2153 | if (intstatus & bus->hostintmask) | 2153 | if (intstatus & bus->hostintmask) |
2154 | bus->ipend = true; | 2154 | atomic_set(&bus->ipend, 1); |
2155 | } | 2155 | } |
2156 | } | 2156 | } |
2157 | 2157 | ||
@@ -2249,7 +2249,7 @@ static inline void brcmf_sdbrcm_clrintr(struct brcmf_sdio *bus) | |||
2249 | unsigned long flags; | 2249 | unsigned long flags; |
2250 | 2250 | ||
2251 | spin_lock_irqsave(&bus->sdiodev->irq_en_lock, flags); | 2251 | spin_lock_irqsave(&bus->sdiodev->irq_en_lock, flags); |
2252 | if (!bus->sdiodev->irq_en && !bus->ipend) { | 2252 | if (!bus->sdiodev->irq_en && !atomic_read(&bus->ipend)) { |
2253 | enable_irq(bus->sdiodev->irq); | 2253 | enable_irq(bus->sdiodev->irq); |
2254 | bus->sdiodev->irq_en = true; | 2254 | bus->sdiodev->irq_en = true; |
2255 | } | 2255 | } |
@@ -2332,8 +2332,8 @@ static bool brcmf_sdbrcm_dpc(struct brcmf_sdio *bus) | |||
2332 | goto clkwait; | 2332 | goto clkwait; |
2333 | 2333 | ||
2334 | /* Pending interrupt indicates new device status */ | 2334 | /* Pending interrupt indicates new device status */ |
2335 | if (bus->ipend) { | 2335 | if (atomic_read(&bus->ipend) > 0) { |
2336 | bus->ipend = false; | 2336 | atomic_set(&bus->ipend, 0); |
2337 | err = r_sdreg32(bus, &newstatus, | 2337 | err = r_sdreg32(bus, &newstatus, |
2338 | offsetof(struct sdpcmd_regs, intstatus)); | 2338 | offsetof(struct sdpcmd_regs, intstatus)); |
2339 | bus->sdcnt.f1regdata++; | 2339 | bus->sdcnt.f1regdata++; |
@@ -2478,7 +2478,7 @@ clkwait: | |||
2478 | } else if (bus->clkstate == CLK_PENDING) { | 2478 | } else if (bus->clkstate == CLK_PENDING) { |
2479 | brcmf_dbg(INFO, "rescheduled due to CLK_PENDING awaiting I_CHIPACTIVE interrupt\n"); | 2479 | brcmf_dbg(INFO, "rescheduled due to CLK_PENDING awaiting I_CHIPACTIVE interrupt\n"); |
2480 | resched = true; | 2480 | resched = true; |
2481 | } else if (bus->intstatus || bus->ipend || | 2481 | } else if (bus->intstatus || atomic_read(&bus->ipend) > 0 || |
2482 | (!bus->fcstate && brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) | 2482 | (!bus->fcstate && brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) |
2483 | && data_ok(bus)) || PKT_AVAILABLE()) { | 2483 | && data_ok(bus)) || PKT_AVAILABLE()) { |
2484 | resched = true; | 2484 | resched = true; |
@@ -3692,7 +3692,7 @@ void brcmf_sdbrcm_isr(void *arg) | |||
3692 | } | 3692 | } |
3693 | /* Count the interrupt call */ | 3693 | /* Count the interrupt call */ |
3694 | bus->sdcnt.intrcount++; | 3694 | bus->sdcnt.intrcount++; |
3695 | bus->ipend = true; | 3695 | atomic_set(&bus->ipend, 1); |
3696 | 3696 | ||
3697 | /* Disable additional interrupts (is this needed now)? */ | 3697 | /* Disable additional interrupts (is this needed now)? */ |
3698 | if (!bus->intr) | 3698 | if (!bus->intr) |
@@ -3740,7 +3740,7 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) | |||
3740 | schedule the DPC */ | 3740 | schedule the DPC */ |
3741 | if (intstatus) { | 3741 | if (intstatus) { |
3742 | bus->sdcnt.pollcnt++; | 3742 | bus->sdcnt.pollcnt++; |
3743 | bus->ipend = true; | 3743 | atomic_set(&bus->ipend, 1); |
3744 | 3744 | ||
3745 | bus->dpc_sched = true; | 3745 | bus->dpc_sched = true; |
3746 | if (bus->dpc_tsk) { | 3746 | if (bus->dpc_tsk) { |
@@ -3784,7 +3784,7 @@ static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus) | |||
3784 | 3784 | ||
3785 | up(&bus->sdsem); | 3785 | up(&bus->sdsem); |
3786 | 3786 | ||
3787 | return bus->ipend; | 3787 | return (atomic_read(&bus->ipend) > 0); |
3788 | } | 3788 | } |
3789 | 3789 | ||
3790 | static bool brcmf_sdbrcm_chipmatch(u16 chipid) | 3790 | static bool brcmf_sdbrcm_chipmatch(u16 chipid) |