|
@@ -277,12 +277,14 @@ int iwl3945_rs_next_rate(struct iwl3945_priv *priv, int rate)
|
|
|
else if (rate == IWL_RATE_6M_INDEX)
|
|
|
next_rate = IWL_RATE_6M_INDEX;
|
|
|
break;
|
|
|
-/* XXX cannot be invoked in current mac80211 so not a regression
|
|
|
- case MODE_IEEE80211B:
|
|
|
- if (rate == IWL_RATE_11M_INDEX_TABLE)
|
|
|
- next_rate = IWL_RATE_5M_INDEX_TABLE;
|
|
|
+ case IEEE80211_BAND_2GHZ:
|
|
|
+ if (!(priv->sta_supp_rates & IWL_OFDM_RATES_MASK) &&
|
|
|
+ iwl3945_is_associated(priv)) {
|
|
|
+ if (rate == IWL_RATE_11M_INDEX)
|
|
|
+ next_rate = IWL_RATE_5M_INDEX;
|
|
|
+ }
|
|
|
break;
|
|
|
- */
|
|
|
+
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -2378,7 +2380,8 @@ int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv)
|
|
|
iwl3945_hw_set_rate_n_flags(iwl3945_rates[i].plcp, 0);
|
|
|
table[index].try_cnt = priv->retry_rate;
|
|
|
prev_index = iwl3945_get_prev_ieee_rate(i);
|
|
|
- table[index].next_rate_index = iwl3945_rates[prev_index].table_rs_index;
|
|
|
+ table[index].next_rate_index =
|
|
|
+ iwl3945_rates[prev_index].table_rs_index;
|
|
|
}
|
|
|
|
|
|
switch (priv->band) {
|
|
@@ -2386,11 +2389,14 @@ int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv)
|
|
|
IWL_DEBUG_RATE("Select A mode rate scale\n");
|
|
|
/* If one of the following CCK rates is used,
|
|
|
* have it fall back to the 6M OFDM rate */
|
|
|
- for (i = IWL_RATE_1M_INDEX_TABLE; i <= IWL_RATE_11M_INDEX_TABLE; i++)
|
|
|
- table[i].next_rate_index = iwl3945_rates[IWL_FIRST_OFDM_RATE].table_rs_index;
|
|
|
+ for (i = IWL_RATE_1M_INDEX_TABLE;
|
|
|
+ i <= IWL_RATE_11M_INDEX_TABLE; i++)
|
|
|
+ table[i].next_rate_index =
|
|
|
+ iwl3945_rates[IWL_FIRST_OFDM_RATE].table_rs_index;
|
|
|
|
|
|
/* Don't fall back to CCK rates */
|
|
|
- table[IWL_RATE_12M_INDEX_TABLE].next_rate_index = IWL_RATE_9M_INDEX_TABLE;
|
|
|
+ table[IWL_RATE_12M_INDEX_TABLE].next_rate_index =
|
|
|
+ IWL_RATE_9M_INDEX_TABLE;
|
|
|
|
|
|
/* Don't drop out of OFDM rates */
|
|
|
table[IWL_RATE_6M_INDEX_TABLE].next_rate_index =
|
|
@@ -2401,11 +2407,20 @@ int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv)
|
|
|
IWL_DEBUG_RATE("Select B/G mode rate scale\n");
|
|
|
/* If an OFDM rate is used, have it fall back to the
|
|
|
* 1M CCK rates */
|
|
|
- for (i = IWL_RATE_6M_INDEX_TABLE; i <= IWL_RATE_54M_INDEX_TABLE; i++)
|
|
|
- table[i].next_rate_index = iwl3945_rates[IWL_FIRST_CCK_RATE].table_rs_index;
|
|
|
|
|
|
- /* CCK shouldn't fall back to OFDM... */
|
|
|
- table[IWL_RATE_11M_INDEX_TABLE].next_rate_index = IWL_RATE_5M_INDEX_TABLE;
|
|
|
+ if (!(priv->sta_supp_rates & IWL_OFDM_RATES_MASK) &&
|
|
|
+ iwl3945_is_associated(priv)) {
|
|
|
+
|
|
|
+ index = IWL_FIRST_CCK_RATE;
|
|
|
+ for (i = IWL_RATE_6M_INDEX_TABLE;
|
|
|
+ i <= IWL_RATE_54M_INDEX_TABLE; i++)
|
|
|
+ table[i].next_rate_index =
|
|
|
+ iwl3945_rates[index].table_rs_index;
|
|
|
+
|
|
|
+ index = IWL_RATE_11M_INDEX_TABLE;
|
|
|
+ /* CCK shouldn't fall back to OFDM... */
|
|
|
+ table[index].next_rate_index = IWL_RATE_5M_INDEX_TABLE;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
default:
|