mac80211 will not send data frames on a STA mode interface that is not associated because the queue for it is stopped, and all remaining data frames that might be sent, e.g. by packet injection, are accepted here anyway, so remove this pointless check. Also hold the spinlock for less time. This will with great probability improve performance in the driver more than the proper descriptor layout can possibly cost. Signed-off-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx> --- Haven't tested this so far, so RFT, but I'm fairly certain it's correct. drivers/net/wireless/iwlwifi/iwl-tx.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) --- everything.orig/drivers/net/wireless/iwlwifi/iwl-tx.c 2008-10-09 11:07:05.000000000 +0200 +++ everything/drivers/net/wireless/iwlwifi/iwl-tx.c 2008-10-09 11:08:45.000000000 +0200 @@ -787,17 +787,18 @@ int iwl_tx_skb(struct iwl_priv *priv, st unsigned long flags; int ret; - spin_lock_irqsave(&priv->lock, flags); - if (iwl_is_rfkill(priv)) { - IWL_DEBUG_DROP("Dropping - RF KILL\n"); - goto drop_unlock; - } - if ((ieee80211_get_tx_rate(priv->hw, info)->hw_value & 0xFF) == IWL_INVALID_RATE) { IWL_ERROR("ERROR: No TX rate available.\n"); + goto drop; + } + + spin_lock_irqsave(&priv->lock, flags); + if (iwl_is_rfkill(priv)) { + IWL_DEBUG_DROP("Dropping - RF KILL\n"); goto drop_unlock; } + spin_unlock_irqrestore(&priv->lock, flags); unicast = !is_multicast_ether_addr(hdr->addr1); @@ -812,19 +813,6 @@ int iwl_tx_skb(struct iwl_priv *priv, st IWL_DEBUG_TX("Sending REASSOC frame\n"); #endif - /* drop all data frame if we are not associated */ - if (ieee80211_is_data(fc) && - (priv->iw_mode != NL80211_IFTYPE_MONITOR || - !(info->flags & IEEE80211_TX_CTL_INJECTED)) && /* packet injection */ - (!iwl_is_associated(priv) || - ((priv->iw_mode == NL80211_IFTYPE_STATION) && !priv->assoc_id) || - !priv->assoc_station_added)) { - IWL_DEBUG_DROP("Dropping - !iwl_is_associated\n"); - goto drop_unlock; - } - - spin_unlock_irqrestore(&priv->lock, flags); - hdr_len = ieee80211_hdrlen(fc); /* Find (or create) index into station table for destination station */ -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html