iwlwifi: check short GI support per-station rather than globally
authorDaniel C Halperin <daniel.c.halperin@intel.com>
Thu, 13 Aug 2009 20:30:58 +0000 (13:30 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 20 Aug 2009 15:33:12 +0000 (11:33 -0400)
Short guard interval support is a local per-station parameter not a global
per-NIC parameter.  (mac80211 will correctly remove SGI support from station
capabilities if the BSS does not permit it).  This patch removes the short GI
support bitfield from the global iwl_ht_info struct and properly uses
per-station HT capabilities during rate selection.

Signed-off-by: Daniel C Halperin <daniel.c.halperin@intel.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-dev.h

index 551c4ba..3b1bbc3 100644 (file)
@@ -1225,18 +1225,6 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
        else
                tbl->is_ht40 = 0;
 
-       /* FIXME: - don't toggle SGI here
-       if (tbl->is_ht40) {
-               if (priv->current_ht_config.sgf & HT_SHORT_GI_40MHZ_ONLY)
-                       tbl->is_SGI = 1;
-               else
-                       tbl->is_SGI = 0;
-       } else if (priv->current_ht_config.sgf & HT_SHORT_GI_20MHZ_ONLY)
-               tbl->is_SGI = 1;
-       else
-               tbl->is_SGI = 0;
-       */
-
        rs_set_expected_tpt_table(lq_sta, tbl);
 
        rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
@@ -1291,18 +1279,6 @@ static int rs_switch_to_mimo3(struct iwl_priv *priv,
        else
                tbl->is_ht40 = 0;
 
-       /* FIXME: - don't toggle SGI here
-       if (tbl->is_ht40) {
-               if (priv->current_ht_config.sgf & HT_SHORT_GI_40MHZ_ONLY)
-                       tbl->is_SGI = 1;
-               else
-                       tbl->is_SGI = 0;
-       } else if (priv->current_ht_config.sgf & HT_SHORT_GI_20MHZ_ONLY)
-               tbl->is_SGI = 1;
-       else
-               tbl->is_SGI = 0;
-       */
-
        rs_set_expected_tpt_table(lq_sta, tbl);
 
        rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
@@ -1350,18 +1326,6 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
        else
                tbl->is_ht40 = 0;
 
-       /* FIXME: - don't toggle SGI here
-       if (tbl->is_ht40) {
-               if (priv->current_ht_config.sgf & HT_SHORT_GI_40MHZ_ONLY)
-                       tbl->is_SGI = 1;
-               else
-                       tbl->is_SGI = 0;
-       } else if (priv->current_ht_config.sgf & HT_SHORT_GI_20MHZ_ONLY)
-               tbl->is_SGI = 1;
-       else
-               tbl->is_SGI = 0;
-       */
-
        if (is_green)
                tbl->is_SGI = 0; /*11n spec: no SGI in SISO+Greenfield*/
 
@@ -1530,6 +1494,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
        struct iwl_scale_tbl_info *search_tbl =
                                &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
        u8 start_action = tbl->action;
@@ -1589,13 +1554,11 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
                                goto out;
                        break;
                case IWL_SISO_SWITCH_GI:
-                       if (!tbl->is_ht40 &&
-                               !(priv->current_ht_config.sgf &
-                                               HT_SHORT_GI_20MHZ))
+                       if (!tbl->is_ht40 && !(ht_cap->cap &
+                                               IEEE80211_HT_CAP_SGI_20))
                                break;
-                       if (tbl->is_ht40 &&
-                               !(priv->current_ht_config.sgf &
-                                               HT_SHORT_GI_40MHZ))
+                       if (tbl->is_ht40 && !(ht_cap->cap &
+                                               IEEE80211_HT_CAP_SGI_40))
                                break;
 
                        IWL_DEBUG_RATE(priv, "LQ: SISO toggle SGI/NGI\n");
@@ -1669,6 +1632,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
        struct iwl_scale_tbl_info *search_tbl =
                                &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
        u8 start_action = tbl->action;
@@ -1729,13 +1693,11 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
                        break;
 
                case IWL_MIMO2_SWITCH_GI:
-                       if (!tbl->is_ht40 &&
-                               !(priv->current_ht_config.sgf &
-                                               HT_SHORT_GI_20MHZ))
+                       if (!tbl->is_ht40 && !(ht_cap->cap &
+                                               IEEE80211_HT_CAP_SGI_20))
                                break;
-                       if (tbl->is_ht40 &&
-                               !(priv->current_ht_config.sgf &
-                                               HT_SHORT_GI_40MHZ))
+                       if (tbl->is_ht40 && !(ht_cap->cap &
+                                               IEEE80211_HT_CAP_SGI_40))
                                break;
 
                        IWL_DEBUG_RATE(priv, "LQ: MIMO2 toggle SGI/NGI\n");
@@ -1811,6 +1773,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
        struct iwl_scale_tbl_info *search_tbl =
                                &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
        u8 start_action = tbl->action;
@@ -1893,13 +1856,11 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
                        break;
 
                case IWL_MIMO3_SWITCH_GI:
-                       if (!tbl->is_ht40 &&
-                               !(priv->current_ht_config.sgf &
-                                               HT_SHORT_GI_20MHZ))
+                       if (!tbl->is_ht40 && !(ht_cap->cap &
+                                               IEEE80211_HT_CAP_SGI_20))
                                break;
-                       if (tbl->is_ht40 &&
-                               !(priv->current_ht_config.sgf &
-                                               HT_SHORT_GI_40MHZ))
+                       if (tbl->is_ht40 && !(ht_cap->cap &
+                                               IEEE80211_HT_CAP_SGI_40))
                                break;
 
                        IWL_DEBUG_RATE(priv, "LQ: MIMO3 toggle SGI/NGI\n");
index 104fd95..b845cf3 100644 (file)
@@ -2391,11 +2391,6 @@ static void iwl_ht_conf(struct iwl_priv *priv,
        }
        ht_conf = &sta->ht_cap;
 
-       if (ht_conf->cap & IEEE80211_HT_CAP_SGI_20)
-               iwl_conf->sgf |= HT_SHORT_GI_20MHZ;
-       if (ht_conf->cap & IEEE80211_HT_CAP_SGI_40)
-               iwl_conf->sgf |= HT_SHORT_GI_40MHZ;
-
        iwl_conf->is_green_field = !!(ht_conf->cap & IEEE80211_HT_CAP_GRN_FLD);
 
        iwl_conf->sm_ps = (u8)((ht_conf->cap & IEEE80211_HT_CAP_SM_PS) >> 2);
index db74534..e6a1c6f 100644 (file)
@@ -508,7 +508,6 @@ struct iwl_ht_info {
        u8 supported_chan_width;
        u8 sm_ps;
        u8 is_green_field;
-       u8 sgf;                 /* HT_SHORT_GI_* short guard interval */
        struct ieee80211_mcs_info mcs;
        /* BSS related data */
        u8 extension_chan_offset;
@@ -728,9 +727,6 @@ struct iwl_dma_ptr {
        size_t size;
 };
 
-#define HT_SHORT_GI_20MHZ      (1 << 0)
-#define HT_SHORT_GI_40MHZ      (1 << 1)
-
 #define IWL_CHANNEL_WIDTH_20MHZ   0
 #define IWL_CHANNEL_WIDTH_40MHZ   1