void brcms_dpc(unsigned long data) { struct brcms_info *wl; wl = (struct brcms_info *) data; spin_lock_bh(&wl->lock); /* call the common second level interrupt handler */ if (wl->pub->up) { if (wl->resched) { unsigned long flags; spin_lock_irqsave(&wl->isr_lock, flags); brcms_c_intrsupd(wl->wlc); spin_unlock_irqrestore(&wl->isr_lock, flags); } wl->resched = brcms_c_dpc(wl->wlc, true); } /* brcms_c_dpc() may bring the driver down */ if (!wl->pub->up) goto done; /* re-schedule dpc */ if (wl->resched) tasklet_schedule(&wl->tasklet); else /* re-enable interrupts */ brcms_intrson(wl); done: spin_unlock_bh(&wl->lock); }
static void brcms_dpc(unsigned long data) { struct brcms_info *wl; wl = (struct brcms_info *) data; LOCK(wl); /* call the common second level interrupt handler */ if (wl->pub->up) { if (wl->resched) { unsigned long flags; INT_LOCK(wl, flags); brcms_c_intrsupd(wl->wlc); INT_UNLOCK(wl, flags); } wl->resched = brcms_c_dpc(wl->wlc, true); } /* brcms_c_dpc() may bring the driver down */ if (!wl->pub->up) goto done; /* re-schedule dpc */ if (wl->resched) tasklet_schedule(&wl->tasklet); else { /* re-enable interrupts */ brcms_intrson(wl); } done: UNLOCK(wl); }