iwlwifi: iwl3945 eliminate sleepable task queue from context
Subsystems (3)
PATCH 4/5 iwlwifi: iwl3945 eliminate sleepable task queue from context
Eleminiate task queuing of iwl_pci_probe, register hw to ieee80211 immediately
--- drivers/net/wireless/iwlwifi/iwl3945-base.c | 66 +++++++++++++++++--------- 1 files changed, 43 insertions(+), 23 deletions(-)
drivers/net/wireless/iwlwifi/iwl3945-base.c +43 -23
@@ -6171,27 +6171,9 @@ static void iwl_alive_start(struct iwl_priv *priv)if (iwl_is_rfkill (priv))return ; -if (!priv->mac80211_registered) { -/* Unlock so any user space entry points can call back into -* the driver without a deadlock... */ -mutex_unlock (&priv->mutex); -iwl_rate_control_register (priv->hw); - rc =ieee80211_register_hw (priv->hw); - priv->hw->conf.beacon_int =100 ; -mutex_lock (&priv->mutex); - -if (rc) { -iwl_rate_control_unregister (priv->hw); -IWL_ERROR ("Failed to register network " -"device (error %d)\n" , rc); -return ; - } - - priv->mac80211_registered =1 ; +iwl_reset_channel_flag (priv); -iwl_reset_channel_flag (priv); - }else -ieee80211_start_queues (priv->hw); +ieee80211_start_queues (priv->hw); priv->active_rate = priv->rates_mask; priv->active_rate_basic = priv->rates_mask &IWL_BASIC_RATES_MASK ;
@@ -6369,7 +6351,8 @@ static int __iwl_up(struct iwl_priv *priv)/* clear (again), then enable host interrupts */ iwl_write32 (priv,CSR_INT ,0xFFFFFFFF ); -iwl_enable_interrupts (priv); +if (priv->mac80211_registered) +iwl_enable_interrupts (priv);/* really make sure rfkill handshake bits are cleared */ iwl_write32 (priv,CSR_UCODE_DRV_GP1_CLR ,CSR_UCODE_SW_BIT_RFKILL );
@@ -6887,10 +6870,21 @@ static void iwl_bg_scan_completed(struct work_struct *work)static int iwl_mac_start (struct ieee80211_hw *hw) { +int ret;struct iwl_priv *priv = hw->priv;IWL_DEBUG_MAC80211 ("enter\n" ); + ret =wait_event_interruptible_timeout (priv->wait_command_queue, +iwl_is_ready (priv),HOST_COMPLETE_TIMEOUT ); + +if (ret == -ERESTARTSYS ) +return ret; +else if (ret ==0 && !iwl_is_ready (priv)) { +IWL_ERROR ("IWL ready timeout\n" ); +return -ETIMEDOUT ; + } +/* we should be verifying the device is ready to be opened */ mutex_lock (&priv->mutex);
@@ -8299,6 +8293,19 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv)cancel_work_sync (&priv->beacon_update); } +static int iwl_register_hw (struct iwl_priv *priv) +{ +int err; +IWL_DEBUG_INFO ("register_hw\n" ); +iwl_rate_control_register (priv->hw); + err =ieee80211_register_hw (priv->hw); +if (!err) { + priv->hw->conf.beacon_int =100 ; + priv->mac80211_registered =1 ; + } +return err; +} +static struct attribute *iwl_sysfs_entries[] = { &dev_attr_antenna.attr, &dev_attr_channels.attr,
@@ -8546,11 +8553,24 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto out_pci_alloc; } + err =__iwl_up (priv); +if (err) { +IWL_ERROR ("Could not make up interface : %d\n" , err); +mutex_unlock (&priv->mutex); + goto out_pci_alloc; + } +mutex_unlock (&priv->mutex); -IWL_DEBUG_INFO ("Queing UP work.\n" ); + err =iwl_register_hw (priv); +if (err) { +iwl_rate_control_unregister (priv->hw); +IWL_ERROR ("Failed to register network " +"device (error %d)\n" , err); + goto out_pci_alloc; + } -queue_work (priv->workqueue, &priv->up); +iwl_enable_interrupts (priv);return 0 ;
Signature · 8 lines
1.5.3.rc5 ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
Hi Joonwoo,
We already did something similiar in our code base. Could you please take a look at this patch?
Thanks,
-yi
Quoted 120 lines · Joonwoo Park
Eleminiate task queuing of
iwl_pci_probe, register hw to ieee80211 immediatelySigned-off-by Joonwoo Park <[email protected]>--- drivers/net/wireless/iwlwifi/iwl3945-base.c | 66 +++++++++++++++++--------- 1 files changed, 43 insertions(+), 23 deletions(-)drivers/net/wireless/iwlwifi/iwl3945-base.c +43
-23@@ -6171,27 +6171,9 @@ static void iwl_alive_start(struct iwl_priv *priv)if (iwl_is_rfkill (priv))return ; -if (!priv->mac80211_registered) { -/* Unlock so any user space entry points can call back into -* the driver without a deadlock... */ -mutex_unlock (&priv->mutex); -iwl_rate_control_register (priv->hw); - rc =ieee80211_register_hw (priv->hw); - priv->hw->conf.beacon_int =100 ; -mutex_lock (&priv->mutex); - -if (rc) { -iwl_rate_control_unregister (priv->hw); -IWL_ERROR ("Failed to register network " -"device (error %d)\n" , rc); -return ; - } - - priv->mac80211_registered =1 ; +iwl_reset_channel_flag (priv); -iwl_reset_channel_flag (priv); - }else -ieee80211_start_queues (priv->hw); +ieee80211_start_queues (priv->hw); priv->active_rate = priv->rates_mask; priv->active_rate_basic = priv->rates_mask &IWL_BASIC_RATES_MASK ;@@ -6369,7 +6351,8 @@ static int __iwl_up(struct iwl_priv *priv)/* clear (again), then enable host interrupts */ iwl_write32 (priv,CSR_INT ,0xFFFFFFFF ); -iwl_enable_interrupts (priv); +if (priv->mac80211_registered) +iwl_enable_interrupts (priv);/* really make sure rfkill handshake bits are cleared */ iwl_write32 (priv,CSR_UCODE_DRV_GP1_CLR ,CSR_UCODE_SW_BIT_RFKILL );@@ -6887,10 +6870,21 @@ static void iwl_bg_scan_completed(struct work_struct *work)static int iwl_mac_start (struct ieee80211_hw *hw) { +int ret;struct iwl_priv *priv = hw->priv;IWL_DEBUG_MAC80211 ("enter\n" ); + ret =wait_event_interruptible_timeout (priv->wait_command_queue, +iwl_is_ready (priv),HOST_COMPLETE_TIMEOUT ); + +if (ret == -ERESTARTSYS ) +return ret; +else if (ret ==0 && !iwl_is_ready (priv)) { +IWL_ERROR ("IWL ready timeout\n" ); +return -ETIMEDOUT ; + } +/* we should be verifying the device is ready to be opened */ mutex_lock (&priv->mutex);@@ -8299,6 +8293,19 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv)cancel_work_sync (&priv->beacon_update); } +static int iwl_register_hw (struct iwl_priv *priv) +{ +int err; +IWL_DEBUG_INFO ("register_hw\n" ); +iwl_rate_control_register (priv->hw); + err =ieee80211_register_hw (priv->hw); +if (!err) { + priv->hw->conf.beacon_int =100 ; + priv->mac80211_registered =1 ; + } +return err; +} +static struct attribute *iwl_sysfs_entries[] = { &dev_attr_antenna.attr, &dev_attr_channels.attr,@@ -8546,11 +8553,24 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto out_pci_alloc; } + err =__iwl_up (priv); +if (err) { +IWL_ERROR ("Could not make up interface : %d\n" , err); +mutex_unlock (&priv->mutex); + goto out_pci_alloc; + } +mutex_unlock (&priv->mutex); -IWL_DEBUG_INFO ("Queing UP work.\n" ); + err =iwl_register_hw (priv); +if (err) { +iwl_rate_control_unregister (priv->hw); +IWL_ERROR ("Failed to register network " +"device (error %d)\n" , err); + goto out_pci_alloc; + } -queue_work (priv->workqueue, &priv->up); +iwl_enable_interrupts (priv);return 0 ;
2008/1/11, Zhu Yi <[email protected]>:
Quoted 9 lines
Hi Joonwoo,
We already did something similiar in our code base. Could you please take a look at this patch?
Thanks,
-yi
Ooops :-)
I should have checked code base, it's my fault.
it's seems very similar, but I could not made build unfortunately. Can you introduce to me how to build it please?
my build error is here:
jason@ehus ~/SRC/DRIVERS/iwlwifi $ KSRC=/home/jason/SRC/LINUX/linux-2.6 make make -C /home/jason/SRC/LINUX/linux-2.6 O= M=/home/jason/SRC/DRIVERS/iwlwifi/compatible/ EXTRA_CFLAGS="-DCONFIG_IWL3945_DEBUG=y -DCONFIG_IWL4965_DEBUG=y -DCONFIG_IWL3945_SPECTRUM_MEASUREMENT=y -DCONFIG_IWL4965_SPECTRUM_MEASUREMENT=y -DCONFIG_IWL4965_SENSITIVITY=y -DCONFIG_IWL3945_QOS=y -DCONFIG_IWL4965_QOS=y" modules
make[1]: Entering directory `/home/jason/SRC/LINUX/linux-2.6'
CC [M] /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.o
In file included from /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:51:/home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl-3945.h:443: error:
expected specifier-qualifier-list before 'ieee80211_key_alg' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c: In function 'iwl3945_add_station':/home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:539: error:
implicit declaration of function 'MAC_ARG' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:539:
warning: too few arguments for format /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c: In function 'iwl3945_commit_rxon':/home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:1161:
warning: too few arguments for format /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c: In function 'iwl3945_update_sta_key_info':/home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:1400: error:
'struct iwl3945_hw_key' has no member named 'alg' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:1401: error:
'struct iwl3945_hw_key' has no member named 'keylen' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:1402: error:
'struct iwl3945_hw_key' has no member named 'key' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:1402: error:
'struct iwl3945_hw_key' has no member named 'key' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c: In function 'iwl3945_build_tx_cmd_hwcrypto':/home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:2594: error:
'struct iwl3945_hw_key' has no member named 'alg' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:2597: error:
'struct iwl3945_hw_key' has no member named 'keylen' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:2597: error:
'struct iwl3945_hw_key' has no member named 'key' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:2597: error:
'struct iwl3945_hw_key' has no member named 'keylen' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:2597: error:
'struct iwl3945_hw_key' has no member named 'key' /home/jason/SRC/DRIVERS/iwlwifi/compatible/iwl3945-base.c:2597: error:
'struct iwl3945_hw_key' has no member named 'keylen'
Thanks,
Joonwoo
Quoted 7 lines · Joonwoo Park
I should have checked code base, it's my fault.
it's seems very similar, but I could not made build unfortunately. Can you introduce to me how to build it please?my build error is here:
jason@ehus ~/SRC/DRIVERS/iwlwifi $
KSRC=/home/jason/SRC/LINUX/linux-2.6 make
The version doesn't work on a .24-rc kernel. Can you compile it with .23?
Thanks,
-yi
2008/1/11, Zhu Yi <[email protected]>:
Quoted 4 lines
The version doesn't work on a .24-rc kernel. Can you compile it with .23?
Thank you for your help, I built it.
Thanks,
Joonwoo