On Sun, 2014-06-08 at 02:52 +0530, Jahnavi Meher wrote: > From: Jahnavi Meher <jahnavi.meher@xxxxxxxxxxxxxxxxxx> > > Adding support for 5GHz. > > Signed-off-by: Jahnavi Meher <jahnavi.meher@xxxxxxxxx> > --- > drivers/net/wireless/rsi/rsi_91x_mac80211.c | 17 +++++--- > drivers/net/wireless/rsi/rsi_91x_mgmt.c | 56 ++++++++++++++++++++++++++- > drivers/net/wireless/rsi/rsi_mgmt.h | 1 + > 3 files changed, 66 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c > index 45bdb99..4700714 100644 > --- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c > +++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c > @@ -723,17 +723,17 @@ static int rsi_mac80211_set_rate_mask(struct ieee80211_hw *hw, > { > struct rsi_hw *adapter = hw->priv; > struct rsi_common *common = adapter->priv; > + enum ieee80211_band band = hw->conf.chandef.chan->band; > > mutex_lock(&common->mutex); > + common->fixedrate_mask[band] = 0; > > - common->fixedrate_mask[IEEE80211_BAND_2GHZ] = 0; > - > - if (mask->control[IEEE80211_BAND_2GHZ].legacy == 0xfff) { > - common->fixedrate_mask[IEEE80211_BAND_2GHZ] = > - (mask->control[IEEE80211_BAND_2GHZ].ht_mcs[0] << 12); > + if (mask->control[band].legacy == 0xfff) { > + common->fixedrate_mask[band] = > + (mask->control[band].ht_mcs[0] << 12); > } else { > - common->fixedrate_mask[IEEE80211_BAND_2GHZ] = > - mask->control[IEEE80211_BAND_2GHZ].legacy; > + common->fixedrate_mask[band] = > + mask->control[band].legacy; > } > mutex_unlock(&common->mutex); > > @@ -980,6 +980,7 @@ int rsi_mac80211_attach(struct rsi_common *common) > > hw->max_tx_aggregation_subframes = 6; > rsi_register_rates_channels(adapter, IEEE80211_BAND_2GHZ); > + rsi_register_rates_channels(adapter, IEEE80211_BAND_5GHZ); > hw->rate_control_algorithm = "AARF"; > > SET_IEEE80211_PERM_ADDR(hw, common->mac_addr); > @@ -997,6 +998,8 @@ int rsi_mac80211_attach(struct rsi_common *common) > wiphy->available_antennas_tx = 1; > wiphy->bands[IEEE80211_BAND_2GHZ] = > &adapter->sbands[IEEE80211_BAND_2GHZ]; > + wiphy->bands[IEEE80211_BAND_5GHZ] = > + &adapter->sbands[IEEE80211_BAND_5GHZ]; > > status = ieee80211_register_hw(hw); > if (status) > diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c > index be9f5ca..ab14151 100644 > --- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c > +++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c > @@ -588,7 +588,13 @@ static int rsi_program_bb_rf(struct rsi_common *common) > > mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12); > mgmt_frame->desc_word[1] = cpu_to_le16(BBP_PROG_IN_TA); > - mgmt_frame->desc_word[4] = cpu_to_le16(common->endpoint << 8); > + > + if (common->band == IEEE80211_BAND_2GHZ) > + common->endpoint = 0; > + else > + common->endpoint = 2; Here the endpoint is 2 for 5GHz... > + mgmt_frame->desc_word[4] = cpu_to_le16(common->endpoint); > > if (common->rf_reset) { > mgmt_frame->desc_word[7] = cpu_to_le16(RF_RESET_ENABLE); > @@ -827,6 +833,54 @@ static int rsi_send_reset_mac(struct rsi_common *common) > } > > /** > + * rsi_band_check() - This function programs the band > + * @common: Pointer to the driver private structure. > + * > + * Return: 0 on success, corresponding error code on failure. > + */ > +int rsi_band_check(struct rsi_common *common) > +{ > + struct rsi_hw *adapter = common->priv; > + struct ieee80211_hw *hw = adapter->hw; > + u8 current_bw = common->channel_width; > + struct ieee80211_channel *curchan = hw->conf.chandef.chan; > + int status = 0; > + > + if (common->band != curchan->band) { > + common->rf_reset = 1; > + common->band = curchan->band; > + > + if (common->band == IEEE80211_BAND_2GHZ) > + common->endpoint = 0; > + else > + common->endpoint = 1; But here it's 1 for 5GHz? Is that intended or should both these cases be 2 for 5GHz? In fact, I don't think you need to set common->endpoint here, because it just gets overwritten by: > + status = rsi_program_bb_rf(common); which might be why this didn't show up in testing. Dan > + if (status) > + return status; > + } > + > + if ((hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) || > + (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20)) > + common->channel_width = BW_20MHZ; > + else > + common->channel_width = BW_40MHZ; > + > + if (current_bw != common->channel_width) { > + common->rf_reset = 1; > + status = rsi_load_bootup_params(common); > + if (status) > + return status; > + > + status = rsi_load_radio_caps(common); > + if (status) > + return status; > + } > + > + return status; > +} > + > +/** > * rsi_set_channel() - This function programs the channel. > * @common: Pointer to the driver private structure. > * @channel: Channel value to be set. > diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h b/drivers/net/wireless/rsi/rsi_mgmt.h > index 225215a..5470d01 100644 > --- a/drivers/net/wireless/rsi/rsi_mgmt.h > +++ b/drivers/net/wireless/rsi/rsi_mgmt.h > @@ -283,4 +283,5 @@ void rsi_core_qos_processor(struct rsi_common *common); > void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb); > int rsi_send_mgmt_pkt(struct rsi_common *common, struct sk_buff *skb); > int rsi_send_data_pkt(struct rsi_common *common, struct sk_buff *skb); > +int rsi_band_check(struct rsi_common *common); > #endif -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html