diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/wl12xx/main.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/sdio.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/spi.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl12xx.h | 3 |
4 files changed, 28 insertions, 2 deletions
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c index 1feb9551ef8f..7126506611c1 100644 --- a/drivers/net/wireless/wl12xx/main.c +++ b/drivers/net/wireless/wl12xx/main.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/vmalloc.h> | 30 | #include <linux/vmalloc.h> |
31 | #include <linux/platform_device.h> | 31 | #include <linux/platform_device.h> |
32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
33 | #include <linux/wl12xx.h> | ||
33 | 34 | ||
34 | #include "wl12xx.h" | 35 | #include "wl12xx.h" |
35 | #include "wl12xx_80211.h" | 36 | #include "wl12xx_80211.h" |
@@ -719,6 +720,13 @@ irqreturn_t wl1271_irq(int irq, void *cookie) | |||
719 | set_bit(WL1271_FLAG_TX_PENDING, &wl->flags); | 720 | set_bit(WL1271_FLAG_TX_PENDING, &wl->flags); |
720 | cancel_work_sync(&wl->tx_work); | 721 | cancel_work_sync(&wl->tx_work); |
721 | 722 | ||
723 | /* | ||
724 | * In case edge triggered interrupt must be used, we cannot iterate | ||
725 | * more than once without introducing race conditions with the hardirq. | ||
726 | */ | ||
727 | if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) | ||
728 | loopcount = 1; | ||
729 | |||
722 | mutex_lock(&wl->mutex); | 730 | mutex_lock(&wl->mutex); |
723 | 731 | ||
724 | wl1271_debug(DEBUG_IRQ, "IRQ work"); | 732 | wl1271_debug(DEBUG_IRQ, "IRQ work"); |
@@ -3648,6 +3656,7 @@ struct ieee80211_hw *wl1271_alloc_hw(void) | |||
3648 | wl->ap_ps_map = 0; | 3656 | wl->ap_ps_map = 0; |
3649 | wl->ap_fw_ps_map = 0; | 3657 | wl->ap_fw_ps_map = 0; |
3650 | wl->quirks = 0; | 3658 | wl->quirks = 0; |
3659 | wl->platform_quirks = 0; | ||
3651 | 3660 | ||
3652 | memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map)); | 3661 | memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map)); |
3653 | for (i = 0; i < ACX_TX_DESCRIPTORS; i++) | 3662 | for (i = 0; i < ACX_TX_DESCRIPTORS; i++) |
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c index 8246e9de4306..bcd4ad7ba90d 100644 --- a/drivers/net/wireless/wl12xx/sdio.c +++ b/drivers/net/wireless/wl12xx/sdio.c | |||
@@ -220,6 +220,7 @@ static int __devinit wl1271_probe(struct sdio_func *func, | |||
220 | struct ieee80211_hw *hw; | 220 | struct ieee80211_hw *hw; |
221 | const struct wl12xx_platform_data *wlan_data; | 221 | const struct wl12xx_platform_data *wlan_data; |
222 | struct wl1271 *wl; | 222 | struct wl1271 *wl; |
223 | unsigned long irqflags; | ||
223 | int ret; | 224 | int ret; |
224 | 225 | ||
225 | /* We are only able to handle the wlan function */ | 226 | /* We are only able to handle the wlan function */ |
@@ -251,9 +252,15 @@ static int __devinit wl1271_probe(struct sdio_func *func, | |||
251 | wl->irq = wlan_data->irq; | 252 | wl->irq = wlan_data->irq; |
252 | wl->ref_clock = wlan_data->board_ref_clock; | 253 | wl->ref_clock = wlan_data->board_ref_clock; |
253 | wl->tcxo_clock = wlan_data->board_tcxo_clock; | 254 | wl->tcxo_clock = wlan_data->board_tcxo_clock; |
255 | wl->platform_quirks = wlan_data->platform_quirks; | ||
256 | |||
257 | if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) | ||
258 | irqflags = IRQF_TRIGGER_RISING; | ||
259 | else | ||
260 | irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT; | ||
254 | 261 | ||
255 | ret = request_threaded_irq(wl->irq, wl1271_hardirq, wl1271_irq, | 262 | ret = request_threaded_irq(wl->irq, wl1271_hardirq, wl1271_irq, |
256 | IRQF_TRIGGER_HIGH | IRQF_ONESHOT, | 263 | irqflags, |
257 | DRIVER_NAME, wl); | 264 | DRIVER_NAME, wl); |
258 | if (ret < 0) { | 265 | if (ret < 0) { |
259 | wl1271_error("request_irq() failed: %d", ret); | 266 | wl1271_error("request_irq() failed: %d", ret); |
diff --git a/drivers/net/wireless/wl12xx/spi.c b/drivers/net/wireless/wl12xx/spi.c index 7b82b5f0e490..51662bb68019 100644 --- a/drivers/net/wireless/wl12xx/spi.c +++ b/drivers/net/wireless/wl12xx/spi.c | |||
@@ -364,6 +364,7 @@ static int __devinit wl1271_probe(struct spi_device *spi) | |||
364 | struct wl12xx_platform_data *pdata; | 364 | struct wl12xx_platform_data *pdata; |
365 | struct ieee80211_hw *hw; | 365 | struct ieee80211_hw *hw; |
366 | struct wl1271 *wl; | 366 | struct wl1271 *wl; |
367 | unsigned long irqflags; | ||
367 | int ret; | 368 | int ret; |
368 | 369 | ||
369 | pdata = spi->dev.platform_data; | 370 | pdata = spi->dev.platform_data; |
@@ -402,6 +403,12 @@ static int __devinit wl1271_probe(struct spi_device *spi) | |||
402 | 403 | ||
403 | wl->ref_clock = pdata->board_ref_clock; | 404 | wl->ref_clock = pdata->board_ref_clock; |
404 | wl->tcxo_clock = pdata->board_tcxo_clock; | 405 | wl->tcxo_clock = pdata->board_tcxo_clock; |
406 | wl->platform_quirks = pdata->platform_quirks; | ||
407 | |||
408 | if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) | ||
409 | irqflags = IRQF_TRIGGER_RISING; | ||
410 | else | ||
411 | irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT; | ||
405 | 412 | ||
406 | wl->irq = spi->irq; | 413 | wl->irq = spi->irq; |
407 | if (wl->irq < 0) { | 414 | if (wl->irq < 0) { |
@@ -411,7 +418,7 @@ static int __devinit wl1271_probe(struct spi_device *spi) | |||
411 | } | 418 | } |
412 | 419 | ||
413 | ret = request_threaded_irq(wl->irq, wl1271_hardirq, wl1271_irq, | 420 | ret = request_threaded_irq(wl->irq, wl1271_hardirq, wl1271_irq, |
414 | IRQF_TRIGGER_HIGH | IRQF_ONESHOT, | 421 | irqflags, |
415 | DRIVER_NAME, wl); | 422 | DRIVER_NAME, wl); |
416 | if (ret < 0) { | 423 | if (ret < 0) { |
417 | wl1271_error("request_irq() failed: %d", ret); | 424 | wl1271_error("request_irq() failed: %d", ret); |
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h index 9ccbcfdd0802..fb2b79fa42b4 100644 --- a/drivers/net/wireless/wl12xx/wl12xx.h +++ b/drivers/net/wireless/wl12xx/wl12xx.h | |||
@@ -579,6 +579,9 @@ struct wl1271 { | |||
579 | 579 | ||
580 | /* Quirks of specific hardware revisions */ | 580 | /* Quirks of specific hardware revisions */ |
581 | unsigned int quirks; | 581 | unsigned int quirks; |
582 | |||
583 | /* Platform limitations */ | ||
584 | unsigned int platform_quirks; | ||
582 | }; | 585 | }; |
583 | 586 | ||
584 | struct wl1271_station { | 587 | struct wl1271_station { |