mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 20:32:04 +09:00
net: wireless: bcm4329: Fix HW_OOB interrupt processing
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
This commit is contained in:
committed by
Colin Cross
parent
399bd7a333
commit
be801727f0
@@ -6,7 +6,7 @@ DHDCFLAGS = -DLINUX -DBCMDRIVER -DBCMDONGLEHOST -DDHDTHREAD -DBCMWPA2 \
|
||||
-Wall -Wstrict-prototypes -Werror -DOOB_INTR_ONLY -DCUSTOMER_HW2 \
|
||||
-DDHD_USE_STATIC_BUF -DMMC_SDIO_ABORT -DDHD_DEBUG_TRAP -DSOFTAP \
|
||||
-DEMBEDDED_PLATFORM -DARP_OFFLOAD_SUPPORT \
|
||||
-DGET_CUSTOM_MAC_ENABLE -DSET_RANDOM_MAC_SOFTAP -DCSCAN \
|
||||
-DGET_CUSTOM_MAC_ENABLE -DSET_RANDOM_MAC_SOFTAP -DCSCAN -DHW_OOB \
|
||||
-Idrivers/net/wireless/bcm4329 -Idrivers/net/wireless/bcm4329/include
|
||||
|
||||
DHDOFILES = dhd_linux.o linux_osl.o bcmutils.o dhd_common.o dhd_custom_gpio.o \
|
||||
|
||||
@@ -570,14 +570,28 @@ bcmsdh_unregister(void)
|
||||
}
|
||||
|
||||
#if defined(OOB_INTR_ONLY)
|
||||
void bcmsdh_oob_intr_set(bool enable)
|
||||
{
|
||||
static bool curstate = 1;
|
||||
|
||||
if (curstate != enable) {
|
||||
if (enable)
|
||||
enable_irq(sdhcinfo->oob_irq);
|
||||
else
|
||||
disable_irq_nosync(sdhcinfo->oob_irq);
|
||||
curstate = enable;
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t wlan_oob_irq(int irq, void *dev_id)
|
||||
{
|
||||
dhd_pub_t *dhdp;
|
||||
|
||||
dhdp = (dhd_pub_t *)dev_get_drvdata(sdhcinfo->dev);
|
||||
|
||||
bcmsdh_oob_intr_set(0);
|
||||
|
||||
if (dhdp == NULL) {
|
||||
disable_irq(sdhcinfo->oob_irq);
|
||||
SDLX_MSG(("Out of band GPIO interrupt fired way too early\n"));
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -618,14 +632,6 @@ void bcmsdh_unregister_oob_intr(void)
|
||||
free_irq(sdhcinfo->oob_irq, NULL);
|
||||
sdhcinfo->oob_irq_registered = FALSE;
|
||||
}
|
||||
|
||||
void bcmsdh_oob_intr_set(bool enable)
|
||||
{
|
||||
if (enable)
|
||||
enable_irq(sdhcinfo->oob_irq);
|
||||
else
|
||||
disable_irq(sdhcinfo->oob_irq);
|
||||
}
|
||||
#endif /* defined(OOB_INTR_ONLY) */
|
||||
/* Module parameters specific to each host-controller driver */
|
||||
|
||||
|
||||
@@ -676,6 +676,8 @@ sdioh_enable_hw_oob_intr(sdioh_info_t *sd, bool enable)
|
||||
else
|
||||
data = 4; /* disable hw oob interrupt */
|
||||
|
||||
data |= 4; /* Active HIGH */
|
||||
|
||||
status = sdioh_request_byte(sd, SDIOH_WRITE, 0, 0xf2, &data);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -4154,6 +4154,9 @@ dhdsdio_dpc(dhd_bus_t *bus)
|
||||
if (newstatus) {
|
||||
W_SDREG(newstatus, ®s->intstatus, retries);
|
||||
bus->f1regdata++;
|
||||
#if defined(OOB_INTR_ONLY)
|
||||
bcmsdh_oob_intr_set(1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4218,6 +4221,7 @@ dhdsdio_dpc(dhd_bus_t *bus)
|
||||
bus->intstatus = intstatus;
|
||||
|
||||
clkwait:
|
||||
|
||||
/* Re-enable interrupts to detect new device events (mailbox, rx frame)
|
||||
* or clock availability. (Allows tx loop to check ipend if desired.)
|
||||
* (Unless register access seems hosed, as we may not be able to ACK...)
|
||||
|
||||
Reference in New Issue
Block a user