[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