diff options
author | Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> | 2014-03-17 09:34:13 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-03-17 13:44:17 -0400 |
commit | f4b5a8032d513a11ef919305048f00e812605318 (patch) | |
tree | 68975307b35ff82cf63da3c570ec3dfcd7b611da /drivers/net/wireless | |
parent | 98a65b59f8109cfafcc3c13b34895087b90dc630 (diff) |
wil6210: fix for HW bug in interrupt setup logic
Hardware bug triggered by the MSI init while INTx asserted for some reason.
De-assert INTx prior to MSI set-up
Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/wil6210/interrupt.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/ath/wil6210/pcie_bus.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/wil6210/wil6210.h | 1 |
3 files changed, 19 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c index 10919f95a83c..52c40e1d593a 100644 --- a/drivers/net/wireless/ath/wil6210/interrupt.c +++ b/drivers/net/wireless/ath/wil6210/interrupt.c | |||
@@ -493,6 +493,23 @@ free0: | |||
493 | 493 | ||
494 | return rc; | 494 | return rc; |
495 | } | 495 | } |
496 | /* can't use wil_ioread32_and_clear because ICC value is not ser yet */ | ||
497 | static inline void wil_clear32(void __iomem *addr) | ||
498 | { | ||
499 | u32 x = ioread32(addr); | ||
500 | |||
501 | iowrite32(x, addr); | ||
502 | } | ||
503 | |||
504 | void wil6210_clear_irq(struct wil6210_priv *wil) | ||
505 | { | ||
506 | wil_clear32(wil->csr + HOSTADDR(RGF_DMA_EP_RX_ICR) + | ||
507 | offsetof(struct RGF_ICR, ICR)); | ||
508 | wil_clear32(wil->csr + HOSTADDR(RGF_DMA_EP_TX_ICR) + | ||
509 | offsetof(struct RGF_ICR, ICR)); | ||
510 | wil_clear32(wil->csr + HOSTADDR(RGF_DMA_EP_MISC_ICR) + | ||
511 | offsetof(struct RGF_ICR, ICR)); | ||
512 | } | ||
496 | 513 | ||
497 | int wil6210_init_irq(struct wil6210_priv *wil, int irq) | 514 | int wil6210_init_irq(struct wil6210_priv *wil, int irq) |
498 | { | 515 | { |
diff --git a/drivers/net/wireless/ath/wil6210/pcie_bus.c b/drivers/net/wireless/ath/wil6210/pcie_bus.c index d96e81131132..c60976144db3 100644 --- a/drivers/net/wireless/ath/wil6210/pcie_bus.c +++ b/drivers/net/wireless/ath/wil6210/pcie_bus.c | |||
@@ -153,6 +153,7 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
153 | pci_set_drvdata(pdev, wil); | 153 | pci_set_drvdata(pdev, wil); |
154 | wil->pdev = pdev; | 154 | wil->pdev = pdev; |
155 | 155 | ||
156 | wil6210_clear_irq(wil); | ||
156 | /* FW should raise IRQ when ready */ | 157 | /* FW should raise IRQ when ready */ |
157 | rc = wil_if_pcie_enable(wil); | 158 | rc = wil_if_pcie_enable(wil); |
158 | if (rc) { | 159 | if (rc) { |
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h index 14f861cd295d..317621c49bf8 100644 --- a/drivers/net/wireless/ath/wil6210/wil6210.h +++ b/drivers/net/wireless/ath/wil6210/wil6210.h | |||
@@ -476,6 +476,7 @@ int wmi_rxon(struct wil6210_priv *wil, bool on); | |||
476 | int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r); | 476 | int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r); |
477 | int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason); | 477 | int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason); |
478 | 478 | ||
479 | void wil6210_clear_irq(struct wil6210_priv *wil); | ||
479 | int wil6210_init_irq(struct wil6210_priv *wil, int irq); | 480 | int wil6210_init_irq(struct wil6210_priv *wil, int irq); |
480 | void wil6210_fini_irq(struct wil6210_priv *wil, int irq); | 481 | void wil6210_fini_irq(struct wil6210_priv *wil, int irq); |
481 | void wil6210_disable_irq(struct wil6210_priv *wil); | 482 | void wil6210_disable_irq(struct wil6210_priv *wil); |