rtlwifi: Run IPS leave work in a tasklet
PATCH 4/8 rtlwifi: Run IPS leave work in a tasklet
This removes the need to use IRQ safe spinlocks in many places.
Signed-off-by Mike McCormack <[email protected]>
--- drivers/net/wireless/rtlwifi/pci.c | 14 ++++++++++++-- drivers/net/wireless/rtlwifi/ps.c | 1 + drivers/net/wireless/rtlwifi/wifi.h | 1 + 3 files changed, 14 insertions(+), 2 deletions(-)
drivers/net/wireless/rtlwifi/pci.c +12 -2
@@ -622,7 +622,7 @@ tx_status_ok:if (((rtlpriv->link_info.num_rx_inperiod + rtlpriv->link_info.num_tx_inperiod) >8 ) || (rtlpriv->link_info.num_rx_inperiod >2 )) { -rtl_lps_leave (hw); +tasklet_schedule (&rtlpriv->works.ips_leave_tasklet); } }
@@ -756,7 +756,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)if (((rtlpriv->link_info.num_rx_inperiod + rtlpriv->link_info.num_tx_inperiod) >8 ) || (rtlpriv->link_info.num_rx_inperiod >2 )) { -rtl_lps_leave (hw); +tasklet_schedule (&rtlpriv->works.ips_leave_tasklet); } new_skb =dev_alloc_skb (rtlpci->rxbuffersize);
@@ -934,6 +934,11 @@ static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw)_rtl_pci_tx_chk_waitq (hw); } +static void _rtl_pci_ips_leave_tasklet (struct ieee80211_hw *hw) +{ +rtl_lps_leave (hw); +} +static void _rtl_pci_prepare_bcn_tasklet (struct ieee80211_hw *hw) {struct rtl_priv *rtlpriv =rtl_priv (hw);
@@ -1032,6 +1037,9 @@ static void _rtl_pci_init_struct(struct ieee80211_hw *hw,tasklet_init (&rtlpriv->works.irq_prepare_bcn_tasklet, (void (*)(unsigned long ))_rtl_pci_prepare_bcn_tasklet, (unsigned long )hw); +tasklet_init (&rtlpriv->works.ips_leave_tasklet, + (void (*)(unsigned long ))_rtl_pci_ips_leave_tasklet, + (unsigned long )hw); } static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
@@ -1494,6 +1502,7 @@ static void rtl_pci_deinit(struct ieee80211_hw *hw)synchronize_irq (rtlpci->pdev->irq);tasklet_kill (&rtlpriv->works.irq_tasklet); +tasklet_kill (&rtlpriv->works.ips_leave_tasklet);flush_workqueue (rtlpriv->works.rtl_wq);destroy_workqueue (rtlpriv->works.rtl_wq);
@@ -1568,6 +1577,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)set_hal_stop (rtlhal); rtlpriv->cfg->ops->disable_interrupt (hw); +tasklet_kill (&rtlpriv->works.ips_leave_tasklet);spin_lock_irqsave (&rtlpriv->locks.rf_ps_lock, flags);while (ppsc->rfchange_inprogress) {
drivers/net/wireless/rtlwifi/ps.c +1 -0
@@ -68,6 +68,7 @@ bool rtl_ps_disable_nic(struct ieee80211_hw *hw)/*<2> Disable Interrupt */ rtlpriv->cfg->ops->disable_interrupt (hw); +tasklet_kill (&rtlpriv->works.irq_tasklet);/*<3> Disable Adapter */ rtlpriv->cfg->ops->hw_disable (hw);
drivers/net/wireless/rtlwifi/wifi.h +1 -0
@@ -1535,6 +1535,7 @@ struct rtl_works {/* For SW LPS */ struct delayed_work ps_work;struct delayed_work ps_rfon_wq; +struct tasklet_struct ips_leave_tasklet; };struct rtl_debug {
Signature · 1 line
1.7.4.1
Quoted 86 lines · Mike McCormack
This removes the need to use IRQ safe spinlocks in many places.
Signed-off-by Mike McCormack<[email protected]>--- drivers/net/wireless/rtlwifi/pci.c | 14 ++++++++++++-- drivers/net/wireless/rtlwifi/ps.c | 1 + drivers/net/wireless/rtlwifi/wifi.h | 1 + 3 files changed, 14 insertions(+), 2 deletions(-)drivers/net/wireless/rtlwifi/pci.c +12
-2@@ -622,7 +622,7 @@ tx_status_ok:if (((rtlpriv->link_info.num_rx_inperiod + rtlpriv->link_info.num_tx_inperiod)>8 ) || (rtlpriv->link_info.num_rx_inperiod>2 )) { -rtl_lps_leave (hw); +tasklet_schedule (&rtlpriv->works.ips_leave_tasklet); } }@@ -756,7 +756,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)if (((rtlpriv->link_info.num_rx_inperiod + rtlpriv->link_info.num_tx_inperiod)>8 ) || (rtlpriv->link_info.num_rx_inperiod>2 )) { -rtl_lps_leave (hw); +tasklet_schedule (&rtlpriv->works.ips_leave_tasklet); } new_skb =dev_alloc_skb (rtlpci->rxbuffersize);@@ -934,6 +934,11 @@ static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw)_rtl_pci_tx_chk_waitq (hw); } +static void _rtl_pci_ips_leave_tasklet (struct ieee80211_hw *hw) +{ +rtl_lps_leave (hw); +} +static void _rtl_pci_prepare_bcn_tasklet (struct ieee80211_hw *hw) {struct rtl_priv *rtlpriv =rtl_priv (hw);@@ -1032,6 +1037,9 @@ static void _rtl_pci_init_struct(struct ieee80211_hw *hw,tasklet_init (&rtlpriv->works.irq_prepare_bcn_tasklet, (void (*)(unsigned long ))_rtl_pci_prepare_bcn_tasklet, (unsigned long )hw); +tasklet_init (&rtlpriv->works.ips_leave_tasklet, + (void (*)(unsigned long ))_rtl_pci_ips_leave_tasklet, + (unsigned long )hw); } static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,@@ -1494,6 +1502,7 @@ static void rtl_pci_deinit(struct ieee80211_hw *hw)synchronize_irq (rtlpci->pdev->irq);tasklet_kill (&rtlpriv->works.irq_tasklet); +tasklet_kill (&rtlpriv->works.ips_leave_tasklet);flush_workqueue (rtlpriv->works.rtl_wq);destroy_workqueue (rtlpriv->works.rtl_wq);@@ -1568,6 +1577,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)set_hal_stop (rtlhal); rtlpriv->cfg->ops->disable_interrupt (hw); +tasklet_kill (&rtlpriv->works.ips_leave_tasklet);spin_lock_irqsave (&rtlpriv->locks.rf_ps_lock, flags);while (ppsc->rfchange_inprogress) {drivers/net/wireless/rtlwifi/ps.c +1
-0@@ -68,6 +68,7 @@ bool rtl_ps_disable_nic(struct ieee80211_hw *hw)/*<2> Disable Interrupt */ rtlpriv->cfg->ops->disable_interrupt (hw); +tasklet_kill (&rtlpriv->works.irq_tasklet);/*<3> Disable Adapter */ rtlpriv->cfg->ops->hw_disable (hw);drivers/net/wireless/rtlwifi/wifi.h +0
-0
drivers/net/wireless/rtlwifi/wifi.h struct rtl_works { · line 1541
Quoted 7 lines
drivers/net/wireless/rtlwifi/wifi.h +1
-0@@ -1535,6 +1535,7 @@ struct rtl_works {/* For SW LPS */ struct delayed_work ps_work;struct delayed_work ps_rfon_wq; +struct tasklet_struct ips_leave_tasklet; };struct rtl_debug {
This is a good idea.
Signed-off-by Larry Finger <[email protected]>
---
Larry