aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945-rs.c31
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965-rs.c27
2 files changed, 33 insertions, 25 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c
index a8223c4cc97c..c4bfba6f3c2b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c
@@ -471,10 +471,11 @@ static void rs_tx_status(void *priv_rate,
471 return; 471 return;
472 } 472 }
473 473
474 rcu_read_lock();
475
474 sta = sta_info_get(local, hdr->addr1); 476 sta = sta_info_get(local, hdr->addr1);
475 if (!sta || !sta->rate_ctrl_priv) { 477 if (!sta || !sta->rate_ctrl_priv) {
476 if (sta) 478 rcu_read_unlock();
477 sta_info_put(sta);
478 IWL_DEBUG_RATE("leave: No STA priv data to update!\n"); 479 IWL_DEBUG_RATE("leave: No STA priv data to update!\n");
479 return; 480 return;
480 } 481 }
@@ -547,7 +548,7 @@ static void rs_tx_status(void *priv_rate,
547 548
548 spin_unlock_irqrestore(&rs_sta->lock, flags); 549 spin_unlock_irqrestore(&rs_sta->lock, flags);
549 550
550 sta_info_put(sta); 551 rcu_read_unlock();
551 552
552 IWL_DEBUG_RATE("leave\n"); 553 IWL_DEBUG_RATE("leave\n");
553 554
@@ -658,6 +659,8 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
658 659
659 IWL_DEBUG_RATE("enter\n"); 660 IWL_DEBUG_RATE("enter\n");
660 661
662 rcu_read_lock();
663
661 sta = sta_info_get(local, hdr->addr1); 664 sta = sta_info_get(local, hdr->addr1);
662 665
663 /* Send management frames and broadcast/multicast data using lowest 666 /* Send management frames and broadcast/multicast data using lowest
@@ -668,8 +671,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
668 !sta || !sta->rate_ctrl_priv) { 671 !sta || !sta->rate_ctrl_priv) {
669 IWL_DEBUG_RATE("leave: No STA priv data to update!\n"); 672 IWL_DEBUG_RATE("leave: No STA priv data to update!\n");
670 sel->rate = rate_lowest(local, band, sta); 673 sel->rate = rate_lowest(local, band, sta);
671 if (sta) 674 rcu_read_unlock();
672 sta_info_put(sta);
673 return; 675 return;
674 } 676 }
675 677
@@ -811,7 +813,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
811 else 813 else
812 sta->txrate_idx = sta->last_txrate_idx; 814 sta->txrate_idx = sta->last_txrate_idx;
813 815
814 sta_info_put(sta); 816 rcu_read_unlock();
815 817
816 IWL_DEBUG_RATE("leave: %d\n", index); 818 IWL_DEBUG_RATE("leave: %d\n", index);
817 819
@@ -843,13 +845,15 @@ int iwl3945_fill_rs_info(struct ieee80211_hw *hw, char *buf, u8 sta_id)
843 unsigned long now = jiffies; 845 unsigned long now = jiffies;
844 u32 max_time = 0; 846 u32 max_time = 0;
845 847
848 rcu_read_lock();
849
846 sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr); 850 sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr);
847 if (!sta || !sta->rate_ctrl_priv) { 851 if (!sta || !sta->rate_ctrl_priv) {
848 if (sta) { 852 if (sta)
849 sta_info_put(sta);
850 IWL_DEBUG_RATE("leave - no private rate data!\n"); 853 IWL_DEBUG_RATE("leave - no private rate data!\n");
851 } else 854 else
852 IWL_DEBUG_RATE("leave - no station!\n"); 855 IWL_DEBUG_RATE("leave - no station!\n");
856 rcu_read_unlock();
853 return sprintf(buf, "station %d not found\n", sta_id); 857 return sprintf(buf, "station %d not found\n", sta_id);
854 } 858 }
855 859
@@ -890,7 +894,7 @@ int iwl3945_fill_rs_info(struct ieee80211_hw *hw, char *buf, u8 sta_id)
890 i = j; 894 i = j;
891 } 895 }
892 spin_unlock_irqrestore(&rs_sta->lock, flags); 896 spin_unlock_irqrestore(&rs_sta->lock, flags);
893 sta_info_put(sta); 897 rcu_read_unlock();
894 898
895 /* Display the average rate of all samples taken. 899 /* Display the average rate of all samples taken.
896 * 900 *
@@ -927,11 +931,12 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
927 return; 931 return;
928 } 932 }
929 933
934 rcu_read_lock();
935
930 sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr); 936 sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr);
931 if (!sta || !sta->rate_ctrl_priv) { 937 if (!sta || !sta->rate_ctrl_priv) {
932 if (sta)
933 sta_info_put(sta);
934 IWL_DEBUG_RATE("leave - no private rate data!\n"); 938 IWL_DEBUG_RATE("leave - no private rate data!\n");
939 rcu_read_unlock();
935 return; 940 return;
936 } 941 }
937 942
@@ -958,7 +963,7 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
958 break; 963 break;
959 } 964 }
960 965
961 sta_info_put(sta); 966 rcu_read_unlock();
962 spin_unlock_irqrestore(&rs_sta->lock, flags); 967 spin_unlock_irqrestore(&rs_sta->lock, flags);
963 968
964 rssi = priv->last_rx_rssi; 969 rssi = priv->last_rx_rssi;
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c
index 48a6a85355ec..46d85fd07faa 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c
@@ -847,12 +847,12 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
847 if (retries > 15) 847 if (retries > 15)
848 retries = 15; 848 retries = 15;
849 849
850 rcu_read_lock();
850 851
851 sta = sta_info_get(local, hdr->addr1); 852 sta = sta_info_get(local, hdr->addr1);
852 853
853 if (!sta || !sta->rate_ctrl_priv) { 854 if (!sta || !sta->rate_ctrl_priv) {
854 if (sta) 855 rcu_read_unlock();
855 sta_info_put(sta);
856 return; 856 return;
857 } 857 }
858 858
@@ -891,7 +891,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
891 if ((rs_index < 0) || (rs_index >= IWL_RATE_COUNT)) { 891 if ((rs_index < 0) || (rs_index >= IWL_RATE_COUNT)) {
892 IWL_DEBUG_RATE("bad rate index at: %d rate 0x%X\n", 892 IWL_DEBUG_RATE("bad rate index at: %d rate 0x%X\n",
893 rs_index, tx_mcs.rate_n_flags); 893 rs_index, tx_mcs.rate_n_flags);
894 sta_info_put(sta); 894 rcu_read_unlock();
895 return; 895 return;
896 } 896 }
897 897
@@ -909,7 +909,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
909 IWL_DEBUG_RATE("initial rate does not match 0x%x 0x%x\n", 909 IWL_DEBUG_RATE("initial rate does not match 0x%x 0x%x\n",
910 tx_mcs.rate_n_flags, 910 tx_mcs.rate_n_flags,
911 le32_to_cpu(table->rs_table[0].rate_n_flags)); 911 le32_to_cpu(table->rs_table[0].rate_n_flags));
912 sta_info_put(sta); 912 rcu_read_unlock();
913 return; 913 return;
914 } 914 }
915 915
@@ -1025,7 +1025,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
1025 1025
1026 /* See if there's a better rate or modulation mode to try. */ 1026 /* See if there's a better rate or modulation mode to try. */
1027 rs_rate_scale_perform(priv, dev, hdr, sta); 1027 rs_rate_scale_perform(priv, dev, hdr, sta);
1028 sta_info_put(sta); 1028 rcu_read_unlock();
1029 return; 1029 return;
1030} 1030}
1031 1031
@@ -2219,6 +2219,8 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
2219 2219
2220 IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n"); 2220 IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n");
2221 2221
2222 rcu_read_lock();
2223
2222 sta = sta_info_get(local, hdr->addr1); 2224 sta = sta_info_get(local, hdr->addr1);
2223 2225
2224 /* Send management frames and broadcast/multicast data using lowest 2226 /* Send management frames and broadcast/multicast data using lowest
@@ -2227,8 +2229,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
2227 if (!ieee80211_is_data(fc) || is_multicast_ether_addr(hdr->addr1) || 2229 if (!ieee80211_is_data(fc) || is_multicast_ether_addr(hdr->addr1) ||
2228 !sta || !sta->rate_ctrl_priv) { 2230 !sta || !sta->rate_ctrl_priv) {
2229 sel->rate = rate_lowest(local, sband, sta); 2231 sel->rate = rate_lowest(local, sband, sta);
2230 if (sta) 2232 rcu_read_unlock();
2231 sta_info_put(sta);
2232 return; 2233 return;
2233 } 2234 }
2234 2235
@@ -2261,7 +2262,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
2261 sel->rate = rate_lowest(local, sband, sta); 2262 sel->rate = rate_lowest(local, sband, sta);
2262 return; 2263 return;
2263 } 2264 }
2264 sta_info_put(sta); 2265 rcu_read_unlock();
2265 2266
2266 sel->rate = &priv->ieee_rates[i]; 2267 sel->rate = &priv->ieee_rates[i];
2267} 2268}
@@ -2735,13 +2736,15 @@ int iwl4965_fill_rs_info(struct ieee80211_hw *hw, char *buf, u8 sta_id)
2735 u32 max_time = 0; 2736 u32 max_time = 0;
2736 u8 lq_type, antenna; 2737 u8 lq_type, antenna;
2737 2738
2739 rcu_read_lock();
2740
2738 sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr); 2741 sta = sta_info_get(local, priv->stations[sta_id].sta.sta.addr);
2739 if (!sta || !sta->rate_ctrl_priv) { 2742 if (!sta || !sta->rate_ctrl_priv) {
2740 if (sta) { 2743 if (sta)
2741 sta_info_put(sta);
2742 IWL_DEBUG_RATE("leave - no private rate data!\n"); 2744 IWL_DEBUG_RATE("leave - no private rate data!\n");
2743 } else 2745 else
2744 IWL_DEBUG_RATE("leave - no station!\n"); 2746 IWL_DEBUG_RATE("leave - no station!\n");
2747 rcu_read_unlock();
2745 return sprintf(buf, "station %d not found\n", sta_id); 2748 return sprintf(buf, "station %d not found\n", sta_id);
2746 } 2749 }
2747 2750
@@ -2808,7 +2811,7 @@ int iwl4965_fill_rs_info(struct ieee80211_hw *hw, char *buf, u8 sta_id)
2808 "active_search %d rate index %d\n", lq_type, antenna, 2811 "active_search %d rate index %d\n", lq_type, antenna,
2809 lq_sta->search_better_tbl, sta->last_txrate_idx); 2812 lq_sta->search_better_tbl, sta->last_txrate_idx);
2810 2813
2811 sta_info_put(sta); 2814 rcu_read_unlock();
2812 return cnt; 2815 return cnt;
2813} 2816}
2814 2817