aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2011-07-04 02:06:44 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-07-16 10:36:56 -0400
commita27367d25da06c24e0379ad4489542016ff11dbb (patch)
treec31b139ed3202f33c89712b8c7fc7cd3a5fec8a1
parent34c1b7ba127d1815b3dd1cb81cc4338ce0e712b7 (diff)
iwlagn: move sync_irq to transport layer
Since all the irq / tasklet is now handled in the transport layer, it should give an API to ensure that all the irq / tasklet have finished running. This will allow the upper layer to release all its resources. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.h8
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.c8
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h5
6 files changed, 20 insertions, 10 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index eb2be0d3048..b2821900312 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -2399,7 +2399,7 @@ void iwlagn_stop_device(struct iwl_priv *priv)
2399 spin_lock_irqsave(&priv->lock, flags); 2399 spin_lock_irqsave(&priv->lock, flags);
2400 iwl_disable_interrupts(priv); 2400 iwl_disable_interrupts(priv);
2401 spin_unlock_irqrestore(&priv->lock, flags); 2401 spin_unlock_irqrestore(&priv->lock, flags);
2402 iwl_synchronize_irq(priv); 2402 trans_sync_irq(priv);
2403 2403
2404 /* device going down, Stop using ICT table */ 2404 /* device going down, Stop using ICT table */
2405 iwl_disable_ict(priv); 2405 iwl_disable_ict(priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 598f16486aa..c91e0104a7a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3734,7 +3734,7 @@ void __devexit iwl_remove(struct iwl_priv * priv)
3734 iwl_disable_interrupts(priv); 3734 iwl_disable_interrupts(priv);
3735 spin_unlock_irqrestore(&priv->lock, flags); 3735 spin_unlock_irqrestore(&priv->lock, flags);
3736 3736
3737 iwl_synchronize_irq(priv); 3737 trans_sync_irq(priv);
3738 3738
3739 iwl_dealloc_ucode(priv); 3739 iwl_dealloc_ucode(priv);
3740 3740
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
index 70188550a4f..fe5451eee82 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
@@ -118,14 +118,6 @@ int iwl_alloc_isr_ict(struct iwl_priv *priv);
118void iwl_free_isr_ict(struct iwl_priv *priv); 118void iwl_free_isr_ict(struct iwl_priv *priv);
119irqreturn_t iwl_isr_ict(int irq, void *data); 119irqreturn_t iwl_isr_ict(int irq, void *data);
120 120
121/* call this function to flush any scheduled tasklet */
122static inline void iwl_synchronize_irq(struct iwl_priv *priv)
123{
124 /* wait to make sure we flush pending tasklet*/
125 synchronize_irq(priv->bus.irq);
126 tasklet_kill(&priv->irq_tasklet);
127}
128
129static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd) 121static inline void iwl_set_calib_hdr(struct iwl_calib_hdr *hdr, u8 cmd)
130{ 122{
131 hdr->op_code = cmd; 123 hdr->op_code = cmd;
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index b38b00cebd2..cb6801c38fd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1243,6 +1243,10 @@ struct iwl_trans;
1243 * @tx_free: frees the tx memory 1243 * @tx_free: frees the tx memory
1244 * @send_cmd:send a host command 1244 * @send_cmd:send a host command
1245 * @send_cmd_pdu:send a host command: flags can be CMD_* 1245 * @send_cmd_pdu:send a host command: flags can be CMD_*
1246 * @sync_irq: the upper layer will typically disable interrupt and call this
1247 * handler. After this handler returns, it is guaranteed that all
1248 * the ISR / tasklet etc... have finished running and the transport
1249 * layer shall not pass any Rx.
1246 * @free: release all the ressource for the transport layer itself such as 1250 * @free: release all the ressource for the transport layer itself such as
1247 * irq, tasklet etc... 1251 * irq, tasklet etc...
1248 */ 1252 */
@@ -1264,6 +1268,7 @@ struct iwl_trans_ops {
1264 struct iwl_tx_cmd *tx_cmd, int txq_id, __le16 fc, bool ampdu, 1268 struct iwl_tx_cmd *tx_cmd, int txq_id, __le16 fc, bool ampdu,
1265 struct iwl_rxon_context *ctx); 1269 struct iwl_rxon_context *ctx);
1266 1270
1271 void (*sync_irq)(struct iwl_priv *priv);
1267 void (*free)(struct iwl_priv *priv); 1272 void (*free)(struct iwl_priv *priv);
1268}; 1273};
1269 1274
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.c b/drivers/net/wireless/iwlwifi/iwl-trans.c
index ecdda6d57b1..ca969028710 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.c
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.c
@@ -705,6 +705,13 @@ static int iwl_trans_tx(struct iwl_priv *priv, struct sk_buff *skb,
705 return 0; 705 return 0;
706} 706}
707 707
708static void iwl_trans_sync_irq(struct iwl_priv *priv)
709{
710 /* wait to make sure we flush pending tasklet*/
711 synchronize_irq(priv->bus.irq);
712 tasklet_kill(&priv->irq_tasklet);
713}
714
708static void iwl_trans_free(struct iwl_priv *priv) 715static void iwl_trans_free(struct iwl_priv *priv)
709{ 716{
710 free_irq(priv->bus.irq, priv); 717 free_irq(priv->bus.irq, priv);
@@ -726,6 +733,7 @@ static const struct iwl_trans_ops trans_ops = {
726 .get_tx_cmd = iwl_trans_get_tx_cmd, 733 .get_tx_cmd = iwl_trans_get_tx_cmd,
727 .tx = iwl_trans_tx, 734 .tx = iwl_trans_tx,
728 735
736 .sync_irq = iwl_trans_sync_irq,
729 .free = iwl_trans_free, 737 .free = iwl_trans_free,
730}; 738};
731 739
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
index f8133ea90af..886730ecf30 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -115,6 +115,11 @@ static inline int trans_tx(struct iwl_priv *priv, struct sk_buff *skb,
115 return priv->trans.ops->tx(priv, skb, tx_cmd, txq_id, fc, ampdu, ctx); 115 return priv->trans.ops->tx(priv, skb, tx_cmd, txq_id, fc, ampdu, ctx);
116} 116}
117 117
118static inline void trans_sync_irq(struct iwl_priv *priv)
119{
120 priv->trans.ops->sync_irq(priv);
121}
122
118static inline void trans_free(struct iwl_priv *priv) 123static inline void trans_free(struct iwl_priv *priv)
119{ 124{
120 priv->trans.ops->free(priv); 125 priv->trans.ops->free(priv);