aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath
diff options
context:
space:
mode:
authorDengke Qiu <dqiu@qca.qualcomm.com>2012-08-28 03:33:42 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2012-10-24 04:49:48 -0400
commit83685091acb878980711c3b28fe42e8959583e84 (patch)
tree65eb1b374eaaeac66d46608f501d06b769e3553f /drivers/net/wireless/ath
parent3814264481fecba02ba60f2e6c6baea2d43b757b (diff)
ath6kl: fix link speed when using sgi
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>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r--drivers/net/wireless/ath/ath6kl/wmi.c13
-rw-r--r--drivers/net/wireless/ath/ath6kl/wmi.h3
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c
index e95b035168a..cd2db42c098 100644
--- a/drivers/net/wireless/ath/ath6kl/wmi.c
+++ b/drivers/net/wireless/ath/ath6kl/wmi.c
@@ -3263,10 +3263,21 @@ int ath6kl_wmi_set_regdomain_cmd(struct wmi *wmi, const char *alpha2)
3263 3263
3264s32 ath6kl_wmi_get_rate(s8 rate_index) 3264s32 ath6kl_wmi_get_rate(s8 rate_index)
3265{ 3265{
3266 u8 sgi = 0;
3267
3266 if (rate_index == RATE_AUTO) 3268 if (rate_index == RATE_AUTO)
3267 return 0; 3269 return 0;
3268 3270
3269 return wmi_rate_tbl[(u32) rate_index][0]; 3271 /* SGI is stored as the MSB of the rate_index */
3272 if (rate_index & RATE_INDEX_MSB) {
3273 rate_index &= RATE_INDEX_WITHOUT_SGI_MASK;
3274 sgi = 1;
3275 }
3276
3277 if (WARN_ON(rate_index > RATE_MCS_7_40))
3278 rate_index = RATE_MCS_7_40;
3279
3280 return wmi_rate_tbl[(u32) rate_index][sgi];
3270} 3281}
3271 3282
3272static int ath6kl_wmi_get_pmkid_list_event_rx(struct wmi *wmi, u8 *datap, 3283static int ath6kl_wmi_get_pmkid_list_event_rx(struct wmi *wmi, u8 *datap,
diff --git a/drivers/net/wireless/ath/ath6kl/wmi.h b/drivers/net/wireless/ath/ath6kl/wmi.h
index a638151cf86..e916e57c9d9 100644
--- a/drivers/net/wireless/ath/ath6kl/wmi.h
+++ b/drivers/net/wireless/ath/ath6kl/wmi.h
@@ -1792,6 +1792,9 @@ struct rx_stats {
1792 a_sle32 ucast_rate; 1792 a_sle32 ucast_rate;
1793} __packed; 1793} __packed;
1794 1794
1795#define RATE_INDEX_WITHOUT_SGI_MASK 0x7f
1796#define RATE_INDEX_MSB 0x80
1797
1795struct tkip_ccmp_stats { 1798struct tkip_ccmp_stats {
1796 __le32 tkip_local_mic_fail; 1799 __le32 tkip_local_mic_fail;
1797 __le32 tkip_cnter_measures_invoked; 1800 __le32 tkip_cnter_measures_invoked;