]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/iwlwifi/iwl-agn-rs.c
iwlwifi: update copyright year to 2009
[mv-sheeva.git] / drivers / net / wireless / iwlwifi / iwl-agn-rs.c
index f3f17929ca0bb1546721f0a1a22e8b7fe2a6dc8d..a82cce5fbff815158137ce1896ae65f014be2da5 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
+ * Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
@@ -463,8 +463,9 @@ static int rs_collect_tx_data(struct iwl_rate_scale_data *windows,
  * Fill uCode API rate_n_flags field, based on "search" or "active" table.
  */
 /* FIXME:RS:remove this function and put the flags statically in the table */
-static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
-                                      int index, u8 use_green)
+static u32 rate_n_flags_from_tbl(struct iwl_priv *priv,
+                                struct iwl_scale_tbl_info *tbl,
+                                int index, u8 use_green)
 {
        u32 rate_n_flags = 0;
 
@@ -475,7 +476,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
 
        } else if (is_Ht(tbl->lq_type)) {
                if (index > IWL_LAST_OFDM_RATE) {
-                       IWL_ERROR("invalid HT rate index %d\n", index);
+                       IWL_ERR(priv, "Invalid HT rate index %d\n", index);
                        index = IWL_LAST_OFDM_RATE;
                }
                rate_n_flags = RATE_MCS_HT_MSK;
@@ -487,7 +488,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
                else
                        rate_n_flags |= iwl_rates[index].plcp_mimo3;
        } else {
-               IWL_ERROR("Invalid tbl->lq_type %d\n", tbl->lq_type);
+               IWL_ERR(priv, "Invalid tbl->lq_type %d\n", tbl->lq_type);
        }
 
        rate_n_flags |= ((tbl->ant_type << RATE_MCS_ANT_POS) &
@@ -507,7 +508,7 @@ static u32 rate_n_flags_from_tbl(struct iwl_scale_tbl_info *tbl,
                        rate_n_flags |= RATE_MCS_GF_MSK;
                        if (is_siso(tbl->lq_type) && tbl->is_SGI) {
                                rate_n_flags &= ~RATE_MCS_SGI_MSK;
-                               IWL_ERROR("GF was set with SGI:SISO\n");
+                               IWL_ERR(priv, "GF was set with SGI:SISO\n");
                        }
                }
        }
@@ -758,7 +759,7 @@ static u32 rs_get_lower_rate(struct iwl_lq_sta *lq_sta,
                low = scale_index;
 
 out:
-       return rate_n_flags_from_tbl(tbl, low, is_green);
+       return rate_n_flags_from_tbl(lq_sta->drv, tbl, low, is_green);
 }
 
 /*
@@ -944,7 +945,8 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
        }
 
        /* See if there's a better rate or modulation mode to try. */
-       rs_rate_scale_perform(priv, hdr, sta, lq_sta);
+       if (sta && sta->supp_rates[sband->band])
+               rs_rate_scale_perform(priv, hdr, sta, lq_sta);
 out:
        return;
 }
@@ -1128,7 +1130,7 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
        s32 rate;
        s8 is_green = lq_sta->is_green;
 
-       if (!conf->ht.enabled || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
 
        if (((sta->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >> 2)
@@ -1175,7 +1177,7 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
                                                rate, rate_mask);
                return -1;
        }
-       tbl->current_rate = rate_n_flags_from_tbl(tbl, rate, is_green);
+       tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
 
        IWL_DEBUG_RATE("LQ: Switch to new mcs %X index is green %X\n",
                     tbl->current_rate, is_green);
@@ -1195,7 +1197,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
        u8 is_green = lq_sta->is_green;
        s32 rate;
 
-       if (!conf->ht.enabled || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
 
        IWL_DEBUG_RATE("LQ: try to switch to SISO\n");
@@ -1235,7 +1237,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
                             rate, rate_mask);
                return -1;
        }
-       tbl->current_rate = rate_n_flags_from_tbl(tbl, rate, is_green);
+       tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, rate, is_green);
        IWL_DEBUG_RATE("LQ: Switch to new mcs %X index is green %X\n",
                     tbl->current_rate, is_green);
        return 0;
@@ -1429,7 +1431,8 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
                                if (!tbl->is_SGI)
                                        break;
                                else
-                                       IWL_ERROR("SGI was set in GF+SISO\n");
+                                       IWL_ERR(priv,
+                                               "SGI was set in GF+SISO\n");
                        }
                        search_tbl->is_SGI = !tbl->is_SGI;
                        rs_set_expected_tpt_table(lq_sta, search_tbl);
@@ -1438,8 +1441,9 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
                                if (tpt >= search_tbl->expected_tpt[index])
                                        break;
                        }
-                       search_tbl->current_rate = rate_n_flags_from_tbl(
-                                               search_tbl, index, is_green);
+                       search_tbl->current_rate =
+                               rate_n_flags_from_tbl(priv, search_tbl,
+                                                     index, is_green);
                        goto out;
                }
                tbl->action++;
@@ -1550,8 +1554,9 @@ static int rs_move_mimo_to_other(struct iwl_priv *priv,
                                if (tpt >= search_tbl->expected_tpt[index])
                                        break;
                        }
-                       search_tbl->current_rate = rate_n_flags_from_tbl(
-                                               search_tbl, index, is_green);
+                       search_tbl->current_rate =
+                               rate_n_flags_from_tbl(priv, search_tbl,
+                                                     index, is_green);
                        goto out;
 
                }
@@ -1744,13 +1749,13 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
                rate_scale_index_msk = rate_mask;
 
        if (!((1 << index) & rate_scale_index_msk)) {
-               IWL_ERROR("Current Rate is not valid\n");
+               IWL_ERR(priv, "Current Rate is not valid\n");
                return;
        }
 
        /* Get expected throughput table and history window for current rate */
        if (!tbl->expected_tpt) {
-               IWL_ERROR("tbl->expected_tpt is NULL\n");
+               IWL_ERR(priv, "tbl->expected_tpt is NULL\n");
                return;
        }
 
@@ -1943,7 +1948,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
 lq_update:
        /* Replace uCode's rate table for the destination station. */
        if (update_lq) {
-               rate = rate_n_flags_from_tbl(tbl, index, is_green);
+               rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
                rs_fill_link_cmd(priv, lq_sta, rate);
                iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC);
        }
@@ -1992,7 +1997,7 @@ lq_update:
                 * stay with best antenna legacy modulation for a while
                 * before next round of mode comparisons. */
                tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]);
-               if (is_legacy(tbl1->lq_type) && !conf->ht.enabled &&
+               if (is_legacy(tbl1->lq_type) && !conf_is_ht(conf) &&
                    lq_sta->action_counter >= 1) {
                        lq_sta->action_counter = 0;
                        IWL_DEBUG_RATE("LQ: STAY in legacy table\n");
@@ -2027,7 +2032,7 @@ lq_update:
        }
 
 out:
-       tbl->current_rate = rate_n_flags_from_tbl(tbl, index, is_green);
+       tbl->current_rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
        i = index;
        lq_sta->last_txrate_idx = i;
 
@@ -2080,7 +2085,7 @@ static void rs_initialize_lq(struct iwl_priv *priv,
        if (!rs_is_valid_ant(valid_tx_ant, tbl->ant_type))
            rs_toggle_antenna(valid_tx_ant, &rate, tbl);
 
-       rate = rate_n_flags_from_tbl(tbl, rate_idx, use_green);
+       rate = rate_n_flags_from_tbl(priv, tbl, rate_idx, use_green);
        tbl->current_rate = rate;
        rs_set_expected_tpt_table(lq_sta, tbl);
        rs_fill_link_cmd(NULL, lq_sta, rate);
@@ -2101,14 +2106,23 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct iwl_lq_sta *lq_sta = priv_sta;
        int rate_idx;
+       u64 mask_bit = 0;
 
        IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n");
 
+       if (sta)
+               mask_bit = sta->supp_rates[sband->band];
+
        /* Send management frames and broadcast/multicast data using lowest
         * rate. */
        if (!ieee80211_is_data(hdr->frame_control) ||
            is_multicast_ether_addr(hdr->addr1) || !sta || !lq_sta) {
-               info->control.rates[0].idx = rate_lowest_index(sband, sta);
+               if (!mask_bit)
+                       info->control.rates[0].idx =
+                                       rate_lowest_index(sband, NULL);
+               else
+                       info->control.rates[0].idx =
+                                       rate_lowest_index(sband, sta);
                return;
        }