ath10k: bitrate_mask add force_sgi support
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>
Fri, 17 Jan 2014 19:04:14 +0000 (20:04 +0100)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 27 Feb 2014 16:40:37 +0000 (18:40 +0200)
Add force SGI support.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/mac.c

index 1fc26fe..d1c5e7a 100644 (file)
@@ -288,6 +288,7 @@ struct ath10k_vif {
 
        u8 fixed_rate;
        u8 fixed_nss;
+       u8 force_sgi;
 };
 
 struct ath10k_vif_iter {
index 0423af2..239357f 100644 (file)
@@ -3909,7 +3909,8 @@ static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
 
 static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
                                       u8 fixed_rate,
-                                      u8 fixed_nss)
+                                      u8 fixed_nss,
+                                      u8 force_sgi)
 {
        struct ath10k *ar = arvif->ar;
        u32 vdev_param;
@@ -3918,12 +3919,16 @@ static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
        mutex_lock(&ar->conf_mutex);
 
        if (arvif->fixed_rate == fixed_rate &&
-           arvif->fixed_nss == fixed_nss)
+           arvif->fixed_nss == fixed_nss &&
+           arvif->force_sgi == force_sgi)
                goto exit;
 
        if (fixed_rate == WMI_FIXED_RATE_NONE)
                ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
 
+       if (force_sgi)
+               ath10k_dbg(ATH10K_DBG_MAC, "mac force sgi\n");
+
        vdev_param = ar->wmi.vdev_param->fixed_rate;
        ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
                                        vdev_param, fixed_rate);
@@ -3949,6 +3954,19 @@ static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
 
        arvif->fixed_nss = fixed_nss;
 
+       vdev_param = ar->wmi.vdev_param->sgi;
+       ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
+                                       force_sgi);
+
+       if (ret) {
+               ath10k_warn("Could not set sgi param %d: %d\n",
+                           force_sgi, ret);
+               ret = -EINVAL;
+               goto exit;
+       }
+
+       arvif->force_sgi = force_sgi;
+
 exit:
        mutex_unlock(&ar->conf_mutex);
        return ret;
@@ -3963,6 +3981,11 @@ static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
        enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
        u8 fixed_rate = WMI_FIXED_RATE_NONE;
        u8 fixed_nss = ar->num_rf_chains;
+       u8 force_sgi;
+
+       force_sgi = mask->control[band].gi;
+       if (force_sgi == NL80211_TXRATE_FORCE_LGI)
+               return -EINVAL;
 
        if (!ath10k_default_bitrate_mask(ar, band, mask)) {
                if (!ath10k_get_fixed_rate_nss(mask, band,
@@ -3971,7 +3994,13 @@ static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
                        return -EINVAL;
        }
 
-       return ath10k_set_fixed_rate_param(arvif, fixed_rate, fixed_nss);
+       if (fixed_rate == WMI_FIXED_RATE_NONE && force_sgi) {
+               ath10k_warn("Could not force SGI usage for default rate settings\n");
+               return -EINVAL;
+       }
+
+       return ath10k_set_fixed_rate_param(arvif, fixed_rate,
+                                          fixed_nss, force_sgi);
 }
 
 static void ath10k_channel_switch_beacon(struct ieee80211_hw *hw,