[PATCH 1/2] Send RX frame directly to mac80211
Eugene Krasnikov
k.eugene.e at gmail.com
Wed Aug 7 03:11:08 EDT 2013
RX frame was handled through the workqueue what is unnecessary.
Signed-off-by: Eugene Krasnikov <k.eugene.e at gmail.com>
---
dxe.c | 13 +++----------
dxe.h | 2 +-
main.c | 3 ---
wcn36xx.h | 1 -
4 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/dxe.c b/dxe.c
index fb7969c..e0def82 100644
--- a/dxe.c
+++ b/dxe.c
@@ -420,8 +420,8 @@ static irqreturn_t wcn36xx_irq_rx_ready(int irq, void *dev)
struct wcn36xx *wcn = (struct wcn36xx *)dev;
disable_irq_nosync(wcn->rx_irq);
- queue_work(wcn->wq, &wcn->rx_ready_work);
-
+ wcn36xx_dxe_rx_frame(wcn);
+ enable_irq(wcn->rx_irq);
return IRQ_HANDLED;
}
@@ -494,10 +494,8 @@ static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn,
return 0;
}
-void wcn36xx_rx_ready_work(struct work_struct *work)
+void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn)
{
- struct wcn36xx *wcn =
- container_of(work, struct wcn36xx, rx_ready_work);
int int_src;
wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_INT_SRC_RAW_REG, &int_src);
@@ -519,8 +517,6 @@ void wcn36xx_rx_ready_work(struct work_struct *work)
if (!int_src)
wcn36xx_warn("No DXE interrupt pending");
-
- enable_irq(wcn->rx_irq);
}
int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn)
@@ -801,9 +797,6 @@ void wcn36xx_dxe_deinit(struct wcn36xx *wcn)
free_irq(wcn->tx_irq, wcn);
free_irq(wcn->rx_irq, wcn);
- /* Flush any pending rx work */
- flush_workqueue(wcn->wq);
-
if (wcn->tx_ack_skb) {
ieee80211_tx_status_irqsafe(wcn->hw, wcn->tx_ack_skb);
wcn->tx_ack_skb = NULL;
diff --git a/dxe.h b/dxe.h
index 95369b5..46138ac 100644
--- a/dxe.h
+++ b/dxe.h
@@ -268,7 +268,7 @@ struct wcn36xx_dxe_mem_pool {
};
int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn);
void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn);
-void wcn36xx_rx_ready_work(struct work_struct *work);
+void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn);
int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn);
void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn);
int wcn36xx_dxe_init(struct wcn36xx *wcn);
diff --git a/main.c b/main.c
index 3d5707a..f241feb 100644
--- a/main.c
+++ b/main.c
@@ -227,8 +227,6 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
goto out_free_dxe_pool;
}
- INIT_WORK(&wcn->rx_ready_work, wcn36xx_rx_ready_work);
-
/* Maximum SMD message size is 4k */
wcn->smd_buf = kmalloc(4096, GFP_KERNEL);
if (!wcn->smd_buf) {
@@ -746,7 +744,6 @@ static int wcn36xx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wow)
wcn->is_suspended = true;
wcn->is_con_lost_pending = false;
- flush_work(&wcn->rx_ready_work);
flush_work(&wcn->smd_work);
mutex_unlock(&wcn->pm_mutex);
diff --git a/wcn36xx.h b/wcn36xx.h
index 895788d..bb4bcea 100644
--- a/wcn36xx.h
+++ b/wcn36xx.h
@@ -191,7 +191,6 @@ struct wcn36xx {
struct work_struct smd_work;
struct work_struct start_work;
- struct work_struct rx_ready_work;
struct completion smd_compl;
bool is_joining;
--
1.8.2.2
More information about the wcn36xx
mailing list