forked from Minki/linux
brcmsmac: cleanup in isr code
brcms_c_isr returns true if interrupt was for us and if dpc should be scheduled which is the same thing. Simplify it. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Piotr Haber <phaber@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
c4dea35e34
commit
94d9902dc0
@ -896,27 +896,22 @@ static void brcms_remove(struct bcma_device *pdev)
|
||||
static irqreturn_t brcms_isr(int irq, void *dev_id)
|
||||
{
|
||||
struct brcms_info *wl;
|
||||
bool ours, wantdpc;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
wl = (struct brcms_info *) dev_id;
|
||||
|
||||
spin_lock(&wl->isr_lock);
|
||||
|
||||
/* call common first level interrupt handler */
|
||||
ours = brcms_c_isr(wl->wlc, &wantdpc);
|
||||
if (ours) {
|
||||
/* if more to do... */
|
||||
if (wantdpc) {
|
||||
|
||||
/* ...and call the second level interrupt handler */
|
||||
/* schedule dpc */
|
||||
tasklet_schedule(&wl->tasklet);
|
||||
}
|
||||
if (brcms_c_isr(wl->wlc)) {
|
||||
/* schedule second level handler */
|
||||
tasklet_schedule(&wl->tasklet);
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
spin_unlock(&wl->isr_lock);
|
||||
|
||||
return IRQ_RETVAL(ours);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2546,10 +2546,6 @@ static inline u32 wlc_intstatus(struct brcms_c_info *wlc, bool in_isr)
|
||||
if (macintstatus == 0)
|
||||
return 0;
|
||||
|
||||
/* interrupts are already turned off for CFE build
|
||||
* Caution: For CFE Turning off the interrupts again has some undesired
|
||||
* consequences
|
||||
*/
|
||||
/* turn off the interrupts */
|
||||
bcma_write32(core, D11REGOFFS(macintmask), 0);
|
||||
(void)bcma_read32(core, D11REGOFFS(macintmask));
|
||||
@ -2592,33 +2588,31 @@ bool brcms_c_intrsupd(struct brcms_c_info *wlc)
|
||||
|
||||
/*
|
||||
* First-level interrupt processing.
|
||||
* Return true if this was our interrupt, false otherwise.
|
||||
* *wantdpc will be set to true if further brcms_c_dpc() processing is required,
|
||||
* Return true if this was our interrupt
|
||||
* and if further brcms_c_dpc() processing is required,
|
||||
* false otherwise.
|
||||
*/
|
||||
bool brcms_c_isr(struct brcms_c_info *wlc, bool *wantdpc)
|
||||
bool brcms_c_isr(struct brcms_c_info *wlc)
|
||||
{
|
||||
struct brcms_hardware *wlc_hw = wlc->hw;
|
||||
u32 macintstatus;
|
||||
|
||||
*wantdpc = false;
|
||||
|
||||
if (!wlc_hw->up || !wlc->macintmask)
|
||||
return false;
|
||||
|
||||
/* read and clear macintstatus and intstatus registers */
|
||||
macintstatus = wlc_intstatus(wlc, true);
|
||||
|
||||
if (macintstatus == 0xffffffff)
|
||||
if (macintstatus == 0xffffffff) {
|
||||
brcms_err(wlc_hw->d11core,
|
||||
"DEVICEREMOVED detected in the ISR code path\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* it is not for us */
|
||||
if (macintstatus == 0)
|
||||
return false;
|
||||
|
||||
*wantdpc = true;
|
||||
|
||||
/* save interrupt status bits */
|
||||
wlc->macintstatus = macintstatus;
|
||||
|
||||
|
@ -282,7 +282,7 @@ extern void brcms_c_intrson(struct brcms_c_info *wlc);
|
||||
extern u32 brcms_c_intrsoff(struct brcms_c_info *wlc);
|
||||
extern void brcms_c_intrsrestore(struct brcms_c_info *wlc, u32 macintmask);
|
||||
extern bool brcms_c_intrsupd(struct brcms_c_info *wlc);
|
||||
extern bool brcms_c_isr(struct brcms_c_info *wlc, bool *wantdpc);
|
||||
extern bool brcms_c_isr(struct brcms_c_info *wlc);
|
||||
extern bool brcms_c_dpc(struct brcms_c_info *wlc, bool bounded);
|
||||
extern bool brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc,
|
||||
struct sk_buff *sdu,
|
||||
|
Loading…
Reference in New Issue
Block a user