rsi: Adding support for 5GHz
authorJahnavi Meher <jahnavi.meher@gmail.com>
Mon, 16 Jun 2014 14:16:31 +0000 (19:46 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 19 Jun 2014 19:49:23 +0000 (15:49 -0400)
Adding support for 5GHz.

Signed-off-by: Jahnavi Meher <jahnavi.meher@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rsi/rsi_91x_mac80211.c
drivers/net/wireless/rsi/rsi_91x_mgmt.c
drivers/net/wireless/rsi/rsi_mgmt.h

index 45bdb995375511ed05813f1a08da5d089a07e9e9..4700714e600f5a109effe9df3844bc87fa2e7770 100644 (file)
@@ -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)
index 92f584e636d4ad0419ff16a9ce672bd8106bf0a1..cbd5a7e7c73c6b2eb1b046ae175c1d2001e9d403 100644 (file)
@@ -623,6 +623,9 @@ int rsi_set_vap_capabilities(struct rsi_common *common, enum opmode mode)
 {
        struct sk_buff *skb = NULL;
        struct rsi_vap_caps *vap_caps;
+       struct rsi_hw *adapter = common->priv;
+       struct ieee80211_hw *hw = adapter->hw;
+       struct ieee80211_conf *conf = &hw->conf;
        u16 vap_id = 0;
 
        rsi_dbg(MGMT_TX_ZONE, "%s: Sending VAP capabilities frame\n", __func__);
@@ -652,13 +655,24 @@ int rsi_set_vap_capabilities(struct rsi_common *common, enum opmode mode)
        vap_caps->frag_threshold = cpu_to_le16(IEEE80211_MAX_FRAG_THRESHOLD);
 
        vap_caps->rts_threshold = cpu_to_le16(common->rts_threshold);
-       vap_caps->default_mgmt_rate = 0;
-       if (conf_is_ht40(&common->priv->hw->conf)) {
-               vap_caps->default_ctrl_rate =
-                               cpu_to_le32(RSI_RATE_6 | FULL40M_ENABLE << 16);
-       } else {
+       vap_caps->default_mgmt_rate = cpu_to_le32(RSI_RATE_6);
+
+       if (common->band == IEEE80211_BAND_5GHZ) {
                vap_caps->default_ctrl_rate = cpu_to_le32(RSI_RATE_6);
+               if (conf_is_ht40(&common->priv->hw->conf)) {
+                       vap_caps->default_ctrl_rate |=
+                               cpu_to_le32(FULL40M_ENABLE << 16);
+               }
+       } else {
+               vap_caps->default_ctrl_rate = cpu_to_le32(RSI_RATE_1);
+               if (conf_is_ht40_minus(conf))
+                       vap_caps->default_ctrl_rate |=
+                               cpu_to_le32(UPPER_20_ENABLE << 16);
+               else if (conf_is_ht40_plus(conf))
+                       vap_caps->default_ctrl_rate |=
+                               cpu_to_le32(LOWER_20_ENABLE << 16);
        }
+
        vap_caps->default_data_rate = 0;
        vap_caps->beacon_interval = cpu_to_le16(200);
        vap_caps->dtim_period = cpu_to_le16(4);
@@ -834,6 +848,63 @@ static int rsi_send_reset_mac(struct rsi_common *common)
        return rsi_send_internal_mgmt_frame(common, skb);
 }
 
+/**
+ * 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 prev_bw = common->channel_width;
+       u8 prev_ep = common->endpoint;
+       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 ((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 (common->band == IEEE80211_BAND_2GHZ) {
+               if (common->channel_width)
+                       common->endpoint = EP_2GHZ_40MHZ;
+               else
+                       common->endpoint = EP_2GHZ_20MHZ;
+       } else {
+               if (common->channel_width)
+                       common->endpoint = EP_5GHZ_40MHZ;
+               else
+                       common->endpoint = EP_5GHZ_20MHZ;
+       }
+
+       if (common->endpoint != prev_ep) {
+               status = rsi_program_bb_rf(common);
+               if (status)
+                       return status;
+       }
+
+       if (common->channel_width != prev_bw) {
+               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.
index 8bff6640dd10be3ae1aa840da0651898015bfd00..f10d6c67e82f16534127091f21f65f0f493d1154 100644 (file)
@@ -304,4 +304,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