diff options
Diffstat (limited to 'drivers/net/wireless/libertas/if_sdio.c')
| -rw-r--r-- | drivers/net/wireless/libertas/if_sdio.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index a7b5cb0c2753..224e9853c480 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c | |||
| @@ -907,7 +907,7 @@ static void if_sdio_interrupt(struct sdio_func *func) | |||
| 907 | card = sdio_get_drvdata(func); | 907 | card = sdio_get_drvdata(func); |
| 908 | 908 | ||
| 909 | cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret); | 909 | cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret); |
| 910 | if (ret) | 910 | if (ret || !cause) |
| 911 | goto out; | 911 | goto out; |
| 912 | 912 | ||
| 913 | lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause); | 913 | lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause); |
| @@ -1008,10 +1008,6 @@ static int if_sdio_probe(struct sdio_func *func, | |||
| 1008 | if (ret) | 1008 | if (ret) |
| 1009 | goto release; | 1009 | goto release; |
| 1010 | 1010 | ||
| 1011 | ret = sdio_claim_irq(func, if_sdio_interrupt); | ||
| 1012 | if (ret) | ||
| 1013 | goto disable; | ||
| 1014 | |||
| 1015 | /* For 1-bit transfers to the 8686 model, we need to enable the | 1011 | /* For 1-bit transfers to the 8686 model, we need to enable the |
| 1016 | * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0 | 1012 | * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0 |
| 1017 | * bit to allow access to non-vendor registers. */ | 1013 | * bit to allow access to non-vendor registers. */ |
| @@ -1083,6 +1079,21 @@ static int if_sdio_probe(struct sdio_func *func, | |||
| 1083 | card->rx_unit = 0; | 1079 | card->rx_unit = 0; |
| 1084 | 1080 | ||
| 1085 | /* | 1081 | /* |
| 1082 | * Set up the interrupt handler late. | ||
| 1083 | * | ||
| 1084 | * If we set it up earlier, the (buggy) hardware generates a spurious | ||
| 1085 | * interrupt, even before the interrupt has been enabled, with | ||
| 1086 | * CCCR_INTx = 0. | ||
| 1087 | * | ||
| 1088 | * We register the interrupt handler late so that we can handle any | ||
| 1089 | * spurious interrupts, and also to avoid generation of that known | ||
| 1090 | * spurious interrupt in the first place. | ||
| 1091 | */ | ||
| 1092 | ret = sdio_claim_irq(func, if_sdio_interrupt); | ||
| 1093 | if (ret) | ||
| 1094 | goto disable; | ||
| 1095 | |||
| 1096 | /* | ||
| 1086 | * Enable interrupts now that everything is set up | 1097 | * Enable interrupts now that everything is set up |
| 1087 | */ | 1098 | */ |
| 1088 | sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret); | 1099 | sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret); |
