ath6kl: add support wmi rate tables with mcs15
authorJessica Wu <wjessica@qca.qualcomm.com>
Tue, 17 Jun 2014 09:41:10 +0000 (12:41 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 14 Jul 2014 13:03:29 +0000 (16:03 +0300)
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>
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/init.c
drivers/net/wireless/ath/ath6kl/main.c
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.h

index bd91c44..23a7763 100644 (file)
@@ -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,
 };
index a0400a1..8cd0cdf 100644 (file)
@@ -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)
index d565546..baa447f 100644 (file)
@@ -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;
 
index 6ecc0a4..94df345 100644 (file)
@@ -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;
+
+               ret = wmi_rate_tbl_mcs15[(u32) rate_index][sgi];
+       } else {
+               if (WARN_ON(rate_index >= ARRAY_SIZE(wmi_rate_tbl)))
+                       return 0;
 
-       return wmi_rate_tbl[(u32) rate_index][sgi];
+               ret = wmi_rate_tbl[(u32) rate_index][sgi];
+       }
+
+       return ret;
 }
 
 static int ath6kl_wmi_get_pmkid_list_event_rx(struct wmi *wmi, u8 *datap,
index 7809afb..8d4d885 100644 (file)
@@ -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);