aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>2013-01-28 11:30:56 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-01-30 15:07:10 -0500
commit7269494e12449e8bd4850e69b653562e369558b3 (patch)
tree928eebab8500dc8b3a60fe07816665e8e64376f7
parent485f107d341cb1d09e010e0466b02a1ad026f489 (diff)
wil6210: Detect FW error
In the firmware, added is ability to report internal errors using IRQ. Catch this IRQ and notify user space via netlink User space get notified like (udevadm monitor --kernel --property): KERNEL[12660.320520] change /devices/pci0000:00/0000:00:1c.1/0000:02:00.0/0000:03:01.0/0000:05:00.0/net/wlan12 (net) ACTION=change DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:02:00.0/0000:03:01.0/0000:05:00.0/net/wlan12 DEVTYPE=wlan EVENT=FW_ERROR IFINDEX=6 INTERFACE=wlan12 SEQNUM=2489 SOURCE=wil6210 SUBSYSTEM=net Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/wil6210/interrupt.c22
-rw-r--r--drivers/net/wireless/ath/wil6210/wil6210.h8
2 files changed, 25 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c
index 38049da71049..d2109d53674a 100644
--- a/drivers/net/wireless/ath/wil6210/interrupt.c
+++ b/drivers/net/wireless/ath/wil6210/interrupt.c
@@ -38,7 +38,9 @@
38#define WIL6210_IMC_RX BIT_DMA_EP_RX_ICR_RX_DONE 38#define WIL6210_IMC_RX BIT_DMA_EP_RX_ICR_RX_DONE
39#define WIL6210_IMC_TX (BIT_DMA_EP_TX_ICR_TX_DONE | \ 39#define WIL6210_IMC_TX (BIT_DMA_EP_TX_ICR_TX_DONE | \
40 BIT_DMA_EP_TX_ICR_TX_DONE_N(0)) 40 BIT_DMA_EP_TX_ICR_TX_DONE_N(0))
41#define WIL6210_IMC_MISC (ISR_MISC_FW_READY | ISR_MISC_MBOX_EVT) 41#define WIL6210_IMC_MISC (ISR_MISC_FW_READY | \
42 ISR_MISC_MBOX_EVT | \
43 ISR_MISC_FW_ERROR)
42 44
43#define WIL6210_IRQ_PSEUDO_MASK (u32)(~(BIT_DMA_PSEUDO_CAUSE_RX | \ 45#define WIL6210_IRQ_PSEUDO_MASK (u32)(~(BIT_DMA_PSEUDO_CAUSE_RX | \
44 BIT_DMA_PSEUDO_CAUSE_TX | \ 46 BIT_DMA_PSEUDO_CAUSE_TX | \
@@ -228,6 +230,17 @@ static irqreturn_t wil6210_irq_tx(int irq, void *cookie)
228 return IRQ_HANDLED; 230 return IRQ_HANDLED;
229} 231}
230 232
233static void wil_notify_fw_error(struct wil6210_priv *wil)
234{
235 struct device *dev = &wil_to_ndev(wil)->dev;
236 char *envp[3] = {
237 [0] = "SOURCE=wil6210",
238 [1] = "EVENT=FW_ERROR",
239 [2] = NULL,
240 };
241 kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
242}
243
231static irqreturn_t wil6210_irq_misc(int irq, void *cookie) 244static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
232{ 245{
233 struct wil6210_priv *wil = cookie; 246 struct wil6210_priv *wil = cookie;
@@ -244,6 +257,13 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
244 257
245 wil6210_mask_irq_misc(wil); 258 wil6210_mask_irq_misc(wil);
246 259
260 if (isr & ISR_MISC_FW_ERROR) {
261 wil_dbg_IRQ(wil, "IRQ: Firmware error\n");
262 clear_bit(wil_status_fwready, &wil->status);
263 wil_notify_fw_error(wil);
264 isr &= ~ISR_MISC_FW_ERROR;
265 }
266
247 if (isr & ISR_MISC_FW_READY) { 267 if (isr & ISR_MISC_FW_READY) {
248 wil_dbg_IRQ(wil, "IRQ: FW ready\n"); 268 wil_dbg_IRQ(wil, "IRQ: FW ready\n");
249 /** 269 /**
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h
index 9bcfffa4006c..3bd244750d1e 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -101,8 +101,7 @@ struct RGF_ICR {
101#define RGF_DMA_EP_MISC_ICR (0x881bec) /* struct RGF_ICR */ 101#define RGF_DMA_EP_MISC_ICR (0x881bec) /* struct RGF_ICR */
102 #define BIT_DMA_EP_MISC_ICR_RX_HTRSH BIT(0) 102 #define BIT_DMA_EP_MISC_ICR_RX_HTRSH BIT(0)
103 #define BIT_DMA_EP_MISC_ICR_TX_NO_ACT BIT(1) 103 #define BIT_DMA_EP_MISC_ICR_TX_NO_ACT BIT(1)
104 #define BIT_DMA_EP_MISC_ICR_FW_INT0 BIT(28) 104 #define BIT_DMA_EP_MISC_ICR_FW_INT(n) BIT(28+n) /* n = [0..3] */
105 #define BIT_DMA_EP_MISC_ICR_FW_INT1 BIT(29)
106 105
107/* Interrupt moderation control */ 106/* Interrupt moderation control */
108#define RGF_DMA_ITR_CNT_TRSH (0x881c5c) 107#define RGF_DMA_ITR_CNT_TRSH (0x881c5c)
@@ -121,8 +120,9 @@ struct RGF_ICR {
121#define SW_INT_MBOX BIT_USER_USER_ICR_SW_INT_2 120#define SW_INT_MBOX BIT_USER_USER_ICR_SW_INT_2
122 121
123/* ISR register bits */ 122/* ISR register bits */
124#define ISR_MISC_FW_READY BIT_DMA_EP_MISC_ICR_FW_INT0 123#define ISR_MISC_FW_READY BIT_DMA_EP_MISC_ICR_FW_INT(0)
125#define ISR_MISC_MBOX_EVT BIT_DMA_EP_MISC_ICR_FW_INT1 124#define ISR_MISC_MBOX_EVT BIT_DMA_EP_MISC_ICR_FW_INT(1)
125#define ISR_MISC_FW_ERROR BIT_DMA_EP_MISC_ICR_FW_INT(3)
126 126
127/* Hardware definitions end */ 127/* Hardware definitions end */
128 128