Commit 326eeee8 authored by Ron Rindjunsky's avatar Ron Rindjunsky Committed by David S. Miller
Browse files

iwlwifi: 802.11n configuring hw_mode parameters to support HT in A/G



This patch fills the mac80211's ieee80211_hw_mode structures with the
needed 802.11n data needed for the new framework

Signed-off-by: default avatarRon Rindjunsky <ron.rindjunsky@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 9e0cc6de
Loading
Loading
Loading
Loading
+24 −0
Original line number Original line Diff line number Diff line
@@ -3768,6 +3768,30 @@ static int parse_elems(u8 *start, size_t len, struct ieee802_11_elems *elems)


	return 0;
	return 0;
}
}

void iwl4965_init_ht_hw_capab(struct ieee80211_ht_info *ht_info, int mode)
{
	ht_info->cap = 0;
	memset(ht_info->supp_mcs_set, 0, 16);

	ht_info->ht_supported = 1;

	if (mode == MODE_IEEE80211A) {
		ht_info->cap |= (u16)IEEE80211_HT_CAP_SUP_WIDTH;
		ht_info->cap |= (u16)IEEE80211_HT_CAP_SGI_40;
		ht_info->supp_mcs_set[4] = 0x01;
	}
	ht_info->cap |= (u16)IEEE80211_HT_CAP_GRN_FLD;
	ht_info->cap |= (u16)IEEE80211_HT_CAP_SGI_20;
	ht_info->cap |= (u16)(IEEE80211_HT_CAP_MIMO_PS &
			     (IWL_MIMO_PS_NONE << 2));

	ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF;
	ht_info->ampdu_density = CFG_HT_MPDU_DENSITY_DEF;

	ht_info->supp_mcs_set[0] = 0xFF;
	ht_info->supp_mcs_set[1] = 0xFF;
}
#endif /* CONFIG_IWL4965_HT */
#endif /* CONFIG_IWL4965_HT */


static void iwl4965_sta_modify_ps_wake(struct iwl4965_priv *priv, int sta_id)
static void iwl4965_sta_modify_ps_wake(struct iwl4965_priv *priv, int sta_id)
+2 −0
Original line number Original line Diff line number Diff line
@@ -801,6 +801,8 @@ extern int iwl4965_set_fat_chan_info(struct iwl4965_priv *priv, int phymode,
extern void iwl4965_rf_kill_ct_config(struct iwl4965_priv *priv);
extern void iwl4965_rf_kill_ct_config(struct iwl4965_priv *priv);


#ifdef CONFIG_IWL4965_HT
#ifdef CONFIG_IWL4965_HT
extern void iwl4965_init_ht_hw_capab(struct ieee80211_ht_info *ht_info,
					int mode);
#ifdef CONFIG_IWL4965_HT_AGG
#ifdef CONFIG_IWL4965_HT_AGG
extern int iwl4965_mac_ht_tx_agg_start(struct ieee80211_hw *hw, u8 *da,
extern int iwl4965_mac_ht_tx_agg_start(struct ieee80211_hw *hw, u8 *da,
				   u16 tid, u16 *start_seq_num);
				   u16 tid, u16 *start_seq_num);
+7 −17
Original line number Original line Diff line number Diff line
@@ -5822,10 +5822,8 @@ static int iwl4965_init_geos(struct iwl4965_priv *priv)
		A = 0,
		A = 0,
		B = 1,
		B = 1,
		G = 2,
		G = 2,
		A_11N = 3,
		G_11N = 4,
	};
	};
	int mode_count = 5;
	int mode_count = 3;


	if (priv->modes) {
	if (priv->modes) {
		IWL_DEBUG_INFO("Geography modes already initialized.\n");
		IWL_DEBUG_INFO("Geography modes already initialized.\n");
@@ -5865,6 +5863,9 @@ static int iwl4965_init_geos(struct iwl4965_priv *priv)
	modes[A].num_rates = 8;	/* just OFDM */
	modes[A].num_rates = 8;	/* just OFDM */
	modes[A].rates = &rates[4];
	modes[A].rates = &rates[4];
	modes[A].num_channels = 0;
	modes[A].num_channels = 0;
#ifdef CONFIG_IWL4965_HT
	iwl4965_init_ht_hw_capab(&modes[A].ht_info, MODE_IEEE80211A);
#endif


	modes[B].mode = MODE_IEEE80211B;
	modes[B].mode = MODE_IEEE80211B;
	modes[B].channels = channels;
	modes[B].channels = channels;
@@ -5877,18 +5878,9 @@ static int iwl4965_init_geos(struct iwl4965_priv *priv)
	modes[G].rates = rates;
	modes[G].rates = rates;
	modes[G].num_rates = 12;	/* OFDM & CCK */
	modes[G].num_rates = 12;	/* OFDM & CCK */
	modes[G].num_channels = 0;
	modes[G].num_channels = 0;

#ifdef CONFIG_IWL4965_HT
	modes[G_11N].mode = MODE_IEEE80211G;
	iwl4965_init_ht_hw_capab(&modes[G].ht_info, MODE_IEEE80211G);
	modes[G_11N].channels = channels;
#endif
	modes[G_11N].num_rates = 13;        /* OFDM & CCK */
	modes[G_11N].rates = rates;
	modes[G_11N].num_channels = 0;

	modes[A_11N].mode = MODE_IEEE80211A;
	modes[A_11N].channels = &channels[ARRAY_SIZE(iwl4965_eeprom_band_1)];
	modes[A_11N].rates = &rates[4];
	modes[A_11N].num_rates = 9; /* just OFDM */
	modes[A_11N].num_channels = 0;


	priv->ieee_channels = channels;
	priv->ieee_channels = channels;
	priv->ieee_rates = rates;
	priv->ieee_rates = rates;
@@ -5908,11 +5900,9 @@ static int iwl4965_init_geos(struct iwl4965_priv *priv)


		if (is_channel_a_band(ch)) {
		if (is_channel_a_band(ch)) {
			geo_ch = &modes[A].channels[modes[A].num_channels++];
			geo_ch = &modes[A].channels[modes[A].num_channels++];
			modes[A_11N].num_channels++;
		} else {
		} else {
			geo_ch = &modes[B].channels[modes[B].num_channels++];
			geo_ch = &modes[B].channels[modes[B].num_channels++];
			modes[G].num_channels++;
			modes[G].num_channels++;
			modes[G_11N].num_channels++;
		}
		}


		geo_ch->freq = ieee80211chan2mhz(ch->channel);
		geo_ch->freq = ieee80211chan2mhz(ch->channel);