ath6kl: fix link speed when using sgi
authorDengke Qiu <dqiu@qca.qualcomm.com>
Tue, 28 Aug 2012 07:33:42 +0000 (15:33 +0800)
committerKalle Valo <kvalo@qca.qualcomm.com>
Wed, 24 Oct 2012 08:49:48 +0000 (11:49 +0300)
The MSB of rate index from FW is used for sgi. But the ath6kl_wmi_get_rate
doesn't handle it. The access to wmi_rate_tbl array may be out of range
if sgi is 1. This may cause the return value of ath6kl_wmi_get_rate()
function is incorrect link rate. We add sgi adjustment to avoid such case.

kvalo: change patch title

Signed-off-by: Dengke Qiu <dqiu@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.h

index e95b035..cd2db42 100644 (file)
@@ -3263,10 +3263,21 @@ int ath6kl_wmi_set_regdomain_cmd(struct wmi *wmi, const char *alpha2)
 
 s32 ath6kl_wmi_get_rate(s8 rate_index)
 {
+       u8 sgi = 0;
+
        if (rate_index == RATE_AUTO)
                return 0;
 
-       return wmi_rate_tbl[(u32) rate_index][0];
+       /* SGI is stored as the MSB of the rate_index */
+       if (rate_index & RATE_INDEX_MSB) {
+               rate_index &= RATE_INDEX_WITHOUT_SGI_MASK;
+               sgi = 1;
+       }
+
+       if (WARN_ON(rate_index > RATE_MCS_7_40))
+               rate_index = RATE_MCS_7_40;
+
+       return wmi_rate_tbl[(u32) rate_index][sgi];
 }
 
 static int ath6kl_wmi_get_pmkid_list_event_rx(struct wmi *wmi, u8 *datap,
index a638151..e916e57 100644 (file)
@@ -1792,6 +1792,9 @@ struct rx_stats {
        a_sle32 ucast_rate;
 } __packed;
 
+#define RATE_INDEX_WITHOUT_SGI_MASK     0x7f
+#define RATE_INDEX_MSB     0x80
+
 struct tkip_ccmp_stats {
        __le32 tkip_local_mic_fail;
        __le32 tkip_cnter_measures_invoked;