ath6kl: add support wmi rate tables with mcs15
Some of the firmware versions support rate tables up to mcs15, add support for that. Signed-off-by: Jessica Wu <wjessica@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
958e1be848
commit
c1d32d3038
|
@ -145,6 +145,9 @@ enum ath6kl_fw_capability {
|
|||
/* use low priority endpoint for all data */
|
||||
ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT,
|
||||
|
||||
/* ratetable is the 2 stream version (max MCS15) */
|
||||
ATH6KL_FW_CAPABILITY_RATETABLE_MCS15,
|
||||
|
||||
/* this needs to be last */
|
||||
ATH6KL_FW_CAPABILITY_MAX,
|
||||
};
|
||||
|
|
|
@ -1576,6 +1576,7 @@ static const struct fw_capa_str_map {
|
|||
{ ATH6KL_FW_CAPABILITY_64BIT_RATES, "64bit-rates" },
|
||||
{ ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS, "ap-inactivity-mins" },
|
||||
{ ATH6KL_FW_CAPABILITY_MAP_LP_ENDPOINT, "map-lp-endpoint" },
|
||||
{ ATH6KL_FW_CAPABILITY_RATETABLE_MCS15, "ratetable-mcs15" },
|
||||
};
|
||||
|
||||
static const char *ath6kl_init_get_fw_capa_name(unsigned int id)
|
||||
|
|
|
@ -702,6 +702,7 @@ static void ath6kl_update_target_stats(struct ath6kl_vif *vif, u8 *ptr, u32 len)
|
|||
struct ath6kl *ar = vif->ar;
|
||||
struct target_stats *stats = &vif->target_stats;
|
||||
struct tkip_ccmp_stats *ccmp_stats;
|
||||
s32 rate;
|
||||
u8 ac;
|
||||
|
||||
if (len < sizeof(*tgt_stats))
|
||||
|
@ -731,8 +732,9 @@ static void ath6kl_update_target_stats(struct ath6kl_vif *vif, u8 *ptr, u32 len)
|
|||
le32_to_cpu(tgt_stats->stats.tx.mult_retry_cnt);
|
||||
stats->tx_rts_fail_cnt +=
|
||||
le32_to_cpu(tgt_stats->stats.tx.rts_fail_cnt);
|
||||
stats->tx_ucast_rate =
|
||||
ath6kl_wmi_get_rate(a_sle32_to_cpu(tgt_stats->stats.tx.ucast_rate));
|
||||
|
||||
rate = a_sle32_to_cpu(tgt_stats->stats.tx.ucast_rate);
|
||||
stats->tx_ucast_rate = ath6kl_wmi_get_rate(ar->wmi, rate);
|
||||
|
||||
stats->rx_pkt += le32_to_cpu(tgt_stats->stats.rx.pkt);
|
||||
stats->rx_byte += le32_to_cpu(tgt_stats->stats.rx.byte);
|
||||
|
@ -749,8 +751,9 @@ static void ath6kl_update_target_stats(struct ath6kl_vif *vif, u8 *ptr, u32 len)
|
|||
le32_to_cpu(tgt_stats->stats.rx.key_cache_miss);
|
||||
stats->rx_decrypt_err += le32_to_cpu(tgt_stats->stats.rx.decrypt_err);
|
||||
stats->rx_dupl_frame += le32_to_cpu(tgt_stats->stats.rx.dupl_frame);
|
||||
stats->rx_ucast_rate =
|
||||
ath6kl_wmi_get_rate(a_sle32_to_cpu(tgt_stats->stats.rx.ucast_rate));
|
||||
|
||||
rate = a_sle32_to_cpu(tgt_stats->stats.rx.ucast_rate);
|
||||
stats->rx_ucast_rate = ath6kl_wmi_get_rate(ar->wmi, rate);
|
||||
|
||||
ccmp_stats = &tgt_stats->stats.tkip_ccmp_stats;
|
||||
|
||||
|
|
|
@ -59,6 +59,55 @@ static const s32 wmi_rate_tbl[][2] = {
|
|||
{0, 0}
|
||||
};
|
||||
|
||||
static const s32 wmi_rate_tbl_mcs15[][2] = {
|
||||
/* {W/O SGI, with SGI} */
|
||||
{1000, 1000},
|
||||
{2000, 2000},
|
||||
{5500, 5500},
|
||||
{11000, 11000},
|
||||
{6000, 6000},
|
||||
{9000, 9000},
|
||||
{12000, 12000},
|
||||
{18000, 18000},
|
||||
{24000, 24000},
|
||||
{36000, 36000},
|
||||
{48000, 48000},
|
||||
{54000, 54000},
|
||||
{6500, 7200}, /* HT 20, MCS 0 */
|
||||
{13000, 14400},
|
||||
{19500, 21700},
|
||||
{26000, 28900},
|
||||
{39000, 43300},
|
||||
{52000, 57800},
|
||||
{58500, 65000},
|
||||
{65000, 72200},
|
||||
{13000, 14400}, /* HT 20, MCS 8 */
|
||||
{26000, 28900},
|
||||
{39000, 43300},
|
||||
{52000, 57800},
|
||||
{78000, 86700},
|
||||
{104000, 115600},
|
||||
{117000, 130000},
|
||||
{130000, 144400}, /* HT 20, MCS 15 */
|
||||
{13500, 15000}, /*HT 40, MCS 0 */
|
||||
{27000, 30000},
|
||||
{40500, 45000},
|
||||
{54000, 60000},
|
||||
{81000, 90000},
|
||||
{108000, 120000},
|
||||
{121500, 135000},
|
||||
{135000, 150000},
|
||||
{27000, 30000}, /*HT 40, MCS 8 */
|
||||
{54000, 60000},
|
||||
{81000, 90000},
|
||||
{108000, 120000},
|
||||
{162000, 180000},
|
||||
{216000, 240000},
|
||||
{243000, 270000},
|
||||
{270000, 300000}, /*HT 40, MCS 15 */
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
/* 802.1d to AC mapping. Refer pg 57 of WMM-test-plan-v1.2 */
|
||||
static const u8 up_to_ac[] = {
|
||||
WMM_AC_BE,
|
||||
|
@ -3280,9 +3329,11 @@ int ath6kl_wmi_set_regdomain_cmd(struct wmi *wmi, const char *alpha2)
|
|||
NO_SYNC_WMIFLAG);
|
||||
}
|
||||
|
||||
s32 ath6kl_wmi_get_rate(s8 rate_index)
|
||||
s32 ath6kl_wmi_get_rate(struct wmi *wmi, s8 rate_index)
|
||||
{
|
||||
struct ath6kl *ar = wmi->parent_dev;
|
||||
u8 sgi = 0;
|
||||
s32 ret;
|
||||
|
||||
if (rate_index == RATE_AUTO)
|
||||
return 0;
|
||||
|
@ -3293,10 +3344,20 @@ s32 ath6kl_wmi_get_rate(s8 rate_index)
|
|||
sgi = 1;
|
||||
}
|
||||
|
||||
if (WARN_ON(rate_index > RATE_MCS_7_40))
|
||||
rate_index = RATE_MCS_7_40;
|
||||
if (test_bit(ATH6KL_FW_CAPABILITY_RATETABLE_MCS15,
|
||||
ar->fw_capabilities)) {
|
||||
if (WARN_ON(rate_index >= ARRAY_SIZE(wmi_rate_tbl_mcs15)))
|
||||
return 0;
|
||||
|
||||
return wmi_rate_tbl[(u32) rate_index][sgi];
|
||||
ret = wmi_rate_tbl_mcs15[(u32) rate_index][sgi];
|
||||
} else {
|
||||
if (WARN_ON(rate_index >= ARRAY_SIZE(wmi_rate_tbl)))
|
||||
return 0;
|
||||
|
||||
ret = wmi_rate_tbl[(u32) rate_index][sgi];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ath6kl_wmi_get_pmkid_list_event_rx(struct wmi *wmi, u8 *datap,
|
||||
|
|
|
@ -2632,7 +2632,7 @@ int ath6kl_wmi_set_htcap_cmd(struct wmi *wmi, u8 if_idx,
|
|||
struct ath6kl_htcap *htcap);
|
||||
int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len);
|
||||
|
||||
s32 ath6kl_wmi_get_rate(s8 rate_index);
|
||||
s32 ath6kl_wmi_get_rate(struct wmi *wmi, s8 rate_index);
|
||||
|
||||
int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, u8 if_idx,
|
||||
__be32 ips0, __be32 ips1);
|
||||
|
|
Loading…
Reference in New Issue