[PATCH 5/7] Enable TX done IRQs
Pontus Fuchs
pontus.fuchs at gmail.com
Tue May 28 10:59:07 EDT 2013
Generate a TX done IRQ when TX transfer is done.
Signed-off-by: Pontus Fuchs <pontus.fuchs at gmail.com>
---
dxe.c | 44 +++++++++++++++++++++++++++++++++++---------
dxe.h | 4 ++--
2 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/dxe.c b/dxe.c
index adc8760..a4780fe 100644
--- a/dxe.c
+++ b/dxe.c
@@ -264,6 +264,38 @@ static void wcn36xx_dxe_ch_free_skbs(struct wcn36xx *wcn,
static irqreturn_t wcn36xx_irq_tx_complete(int irq, void *dev)
{
+ struct wcn36xx *wcn = (struct wcn36xx *)dev;
+ int int_src, int_reason;
+
+ wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_INT_SRC_RAW_REG, &int_src);
+
+ if (int_src & WCN36XX_INT_MASK_CHAN_TX_H) {
+ wcn36xx_dxe_read_register(wcn,
+ WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_H,
+ &int_reason);
+
+ wcn36xx_dxe_write_register(wcn,
+ WCN36XX_DXE_INT_CLR_ADDR,
+ WCN36XX_INT_MASK_CHAN_TX_H);
+
+ wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_INT_END_CLR_ADDR,
+ WCN36XX_INT_MASK_CHAN_TX_H);
+ wcn36xx_dbg(WCN36XX_DBG_DXE, "dxe tx ready high");
+ }
+ if (int_src & WCN36XX_INT_MASK_CHAN_TX_L) {
+ wcn36xx_dxe_read_register(wcn,
+ WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_L,
+ &int_reason);
+
+ wcn36xx_dxe_write_register(wcn,
+ WCN36XX_DXE_INT_CLR_ADDR,
+ WCN36XX_INT_MASK_CHAN_TX_L);
+
+ wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_INT_END_CLR_ADDR,
+ WCN36XX_INT_MASK_CHAN_TX_L);
+ wcn36xx_dbg(WCN36XX_DBG_DXE, "dxe tx ready low");
+ }
+
return IRQ_HANDLED;
}
@@ -278,25 +310,19 @@ static int wcn36xx_dxe_request_irqs(struct wcn36xx *wcn)
{
int ret;
- // Register TX complete irq
- ret =request_irq(wcn->tx_irq, wcn36xx_irq_tx_complete, IRQF_TRIGGER_HIGH,
- "wcn36xx_tx", wcn);
+ ret = request_irq(wcn->tx_irq, wcn36xx_irq_tx_complete,
+ IRQF_TRIGGER_HIGH, "wcn36xx_tx", wcn);
if (ret) {
wcn36xx_error("failed to alloc tx irq");
goto out_err;
}
- // Register RX irq
ret = request_irq(wcn->rx_irq, wcn36xx_irq_rx_ready, IRQF_TRIGGER_HIGH,
- "wcn36xx_rx", wcn);
+ "wcn36xx_rx", wcn);
if (ret) {
wcn36xx_error("failed to alloc rx irq");
goto out_txirq;
}
- // disable tx irq, not supported
- disable_irq_nosync(wcn->tx_irq);
-
- // enable rx irq
enable_irq_wake(wcn->rx_irq);
return 0;
diff --git a/dxe.h b/dxe.h
index fa25ecc..62cefe9 100644
--- a/dxe.h
+++ b/dxe.h
@@ -38,9 +38,9 @@ RX_HIGH = DMA3
#define WCN36XX_DXE_CTRL_RX_L 0x12ad2f
#define WCN36XX_DXE_CTRL_RX_H 0x12d12f
#define WCN36XX_DXE_CTRL_TX_H_BD 0x32ce45
-#define WCN36XX_DXE_CTRL_TX_H_SKB 0x32ce4d
+#define WCN36XX_DXE_CTRL_TX_H_SKB 0x33ce4d
#define WCN36XX_DXE_CTRL_TX_L_BD 0x328a45
-#define WCN36XX_DXE_CTRL_TX_L_SKB 0x328a4d
+#define WCN36XX_DXE_CTRL_TX_L_SKB 0x338a4d
// TODO This must calculated properly but not hardcoded
#define WCN36XX_DXE_WQ_TX_L 0x17
--
1.8.1.2
More information about the wcn36xx
mailing list