aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>2014-03-17 09:34:13 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-03-17 13:44:17 -0400
commitf4b5a8032d513a11ef919305048f00e812605318 (patch)
tree68975307b35ff82cf63da3c570ec3dfcd7b611da /drivers/net/wireless
parent98a65b59f8109cfafcc3c13b34895087b90dc630 (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.c17
-rw-r--r--drivers/net/wireless/ath/wil6210/pcie_bus.c1
-rw-r--r--drivers/net/wireless/ath/wil6210/wil6210.h1
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 */
497static inline void wil_clear32(void __iomem *addr)
498{
499 u32 x = ioread32(addr);
500
501 iowrite32(x, addr);
502}
503
504void 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
497int wil6210_init_irq(struct wil6210_priv *wil, int irq) 514int 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);
476int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r); 476int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r);
477int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason); 477int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason);
478 478
479void wil6210_clear_irq(struct wil6210_priv *wil);
479int wil6210_init_irq(struct wil6210_priv *wil, int irq); 480int wil6210_init_irq(struct wil6210_priv *wil, int irq);
480void wil6210_fini_irq(struct wil6210_priv *wil, int irq); 481void wil6210_fini_irq(struct wil6210_priv *wil, int irq);
481void wil6210_disable_irq(struct wil6210_priv *wil); 482void wil6210_disable_irq(struct wil6210_priv *wil);