OSDN Git Service

ath10k: Add peer param map for tlv and non-tlv
authorRakesh Pillai <pillair@codeaurora.org>
Tue, 19 Feb 2019 06:09:36 +0000 (11:39 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 23 Sep 2019 07:27:56 +0000 (10:27 +0300)
The peer param id for PEER_PARAM_USE_FIXED_PWR
is different for tlv and non-tlv firmware. This
causes incorrect peer param to be set by the driver
to the firmware(tlv/non-tlv).

Create seperate peer param map for tlv and non-tlv
firmware and attach the peer param id based on the
firmware type during the init.

Tested HW: WCN3990
Tested FW: WLAN.HL.3.1-00784-QCAHLSWMTPLZ-1

Signed-off-by: Rakesh Pillai <pillair@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/debugfs_sta.c
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi-tlv.c
drivers/net/wireless/ath/ath10k/wmi-tlv.h
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index 4d7db07..c96d1a1 100644 (file)
@@ -169,6 +169,7 @@ struct ath10k_wmi {
        struct wmi_cmd_map *cmd;
        struct wmi_vdev_param_map *vdev_param;
        struct wmi_pdev_param_map *pdev_param;
+       struct wmi_peer_param_map *peer_param;
        const struct wmi_ops *ops;
        const struct wmi_peer_flags_map *peer_flags;
 
index 42931a6..367539f 100644 (file)
@@ -430,7 +430,7 @@ ath10k_dbg_sta_write_peer_debug_trigger(struct file *file,
        }
 
        ret = ath10k_wmi_peer_set_param(ar, arsta->arvif->vdev_id, sta->addr,
-                                       WMI_PEER_DEBUG, peer_debug_trigger);
+                                       ar->wmi.peer_param->debug, peer_debug_trigger);
        if (ret) {
                ath10k_warn(ar, "failed to set param to trigger peer tid logs for station ret: %d\n",
                            ret);
index f7a318e..02ca34b 100644 (file)
@@ -2773,7 +2773,7 @@ static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
                return -EINVAL;
 
        return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
-                                        WMI_PEER_SMPS_STATE,
+                                        ar->wmi.peer_param->smps_state,
                                         ath10k_smps_map[smps]);
 }
 
@@ -2930,7 +2930,7 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
         * poked with peer param command.
         */
        ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
-                                       WMI_PEER_DUMMY_VAR, 1);
+                                       ar->wmi.peer_param->dummy_var, 1);
        if (ret) {
                ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
                            arvif->bssid, arvif->vdev_id, ret);
@@ -6249,7 +6249,7 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 
        if (sta && sta->tdls)
                ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
-                                         WMI_PEER_AUTHORIZE, 1);
+                                         ar->wmi.peer_param->authorize, 1);
 
 exit:
        mutex_unlock(&ar->conf_mutex);
@@ -6340,7 +6340,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
                           sta->addr, bw, mode);
 
                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
-                                               WMI_PEER_PHYMODE, mode);
+                                               ar->wmi.peer_param->phymode, mode);
                if (err) {
                        ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
                                    sta->addr, mode, err);
@@ -6348,7 +6348,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
                }
 
                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
-                                               WMI_PEER_CHAN_WIDTH, bw);
+                                               ar->wmi.peer_param->chan_width, bw);
                if (err)
                        ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
                                    sta->addr, bw, err);
@@ -6359,7 +6359,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
                           sta->addr, nss);
 
                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
-                                               WMI_PEER_NSS, nss);
+                                               ar->wmi.peer_param->nss, nss);
                if (err)
                        ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
                                    sta->addr, nss, err);
@@ -6370,7 +6370,7 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
                           sta->addr, smps);
 
                err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
-                                               WMI_PEER_SMPS_STATE, smps);
+                                               ar->wmi.peer_param->smps_state, smps);
                if (err)
                        ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
                                    sta->addr, smps, err);
@@ -6444,7 +6444,7 @@ static int ath10k_sta_set_txpwr(struct ieee80211_hw *hw,
        mutex_lock(&ar->conf_mutex);
 
        ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
-                                       WMI_PEER_USE_FIXED_PWR, txpwr);
+                                       ar->wmi.peer_param->use_fixed_power, txpwr);
        if (ret) {
                ath10k_warn(ar, "failed to set tx power for station ret: %d\n",
                            ret);
index 4d5d10c..0ca8f9c 100644 (file)
@@ -4206,6 +4206,24 @@ static struct wmi_pdev_param_map wmi_tlv_pdev_param_map = {
        .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED,
 };
 
+static struct wmi_peer_param_map wmi_tlv_peer_param_map = {
+       .smps_state = WMI_TLV_PEER_SMPS_STATE,
+       .ampdu = WMI_TLV_PEER_AMPDU,
+       .authorize = WMI_TLV_PEER_AUTHORIZE,
+       .chan_width = WMI_TLV_PEER_CHAN_WIDTH,
+       .nss = WMI_TLV_PEER_NSS,
+       .use_4addr = WMI_TLV_PEER_USE_4ADDR,
+       .membership = WMI_TLV_PEER_MEMBERSHIP,
+       .user_pos = WMI_TLV_PEER_USERPOS,
+       .crit_proto_hint_enabled = WMI_TLV_PEER_CRIT_PROTO_HINT_ENABLED,
+       .tx_fail_cnt_thr = WMI_TLV_PEER_TX_FAIL_CNT_THR,
+       .set_hw_retry_cts2s = WMI_TLV_PEER_SET_HW_RETRY_CTS2S,
+       .ibss_atim_win_len = WMI_TLV_PEER_IBSS_ATIM_WINDOW_LENGTH,
+       .phymode = WMI_TLV_PEER_PHYMODE,
+       .use_fixed_power = WMI_TLV_PEER_USE_FIXED_PWR,
+       .dummy_var = WMI_TLV_PEER_DUMMY_VAR,
+};
+
 static struct wmi_vdev_param_map wmi_tlv_vdev_param_map = {
        .rts_threshold = WMI_TLV_VDEV_PARAM_RTS_THRESHOLD,
        .fragmentation_threshold = WMI_TLV_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
@@ -4394,6 +4412,7 @@ void ath10k_wmi_tlv_attach(struct ath10k *ar)
        ar->wmi.cmd = &wmi_tlv_cmd_map;
        ar->wmi.vdev_param = &wmi_tlv_vdev_param_map;
        ar->wmi.pdev_param = &wmi_tlv_pdev_param_map;
+       ar->wmi.peer_param = &wmi_tlv_peer_param_map;
        ar->wmi.ops = &wmi_tlv_ops;
        ar->wmi.peer_flags = &wmi_tlv_peer_flags_map;
 }
index 649b229..0b7cb01 100644 (file)
@@ -528,6 +528,24 @@ enum wmi_tlv_vdev_param {
        WMI_TLV_VDEV_PARAM_IBSS_PS_1RX_CHAIN_IN_ATIM_WINDOW_ENABLE,
 };
 
+enum wmi_tlv_peer_param {
+       WMI_TLV_PEER_SMPS_STATE = 0x1, /* see %wmi_peer_smps_state */
+       WMI_TLV_PEER_AMPDU      = 0x2,
+       WMI_TLV_PEER_AUTHORIZE  = 0x3,
+       WMI_TLV_PEER_CHAN_WIDTH = 0x4,
+       WMI_TLV_PEER_NSS        = 0x5,
+       WMI_TLV_PEER_USE_4ADDR  = 0x6,
+       WMI_TLV_PEER_MEMBERSHIP = 0x7,
+       WMI_TLV_PEER_USERPOS = 0x8,
+       WMI_TLV_PEER_CRIT_PROTO_HINT_ENABLED = 0x9,
+       WMI_TLV_PEER_TX_FAIL_CNT_THR = 0xa,
+       WMI_TLV_PEER_SET_HW_RETRY_CTS2S = 0xb,
+       WMI_TLV_PEER_IBSS_ATIM_WINDOW_LENGTH = 0xc,
+       WMI_TLV_PEER_PHYMODE = 0xd,
+       WMI_TLV_PEER_USE_FIXED_PWR = 0xe,
+       WMI_TLV_PEER_DUMMY_VAR = 0xff,
+};
+
 enum wmi_tlv_peer_flags {
        WMI_TLV_PEER_AUTH = 0x00000001,
        WMI_TLV_PEER_QOS = 0x00000002,
index 4f707c6..1ec609d 100644 (file)
@@ -742,6 +742,19 @@ static struct wmi_cmd_map wmi_10_4_cmd_map = {
        .radar_found_cmdid = WMI_10_4_RADAR_FOUND_CMDID,
 };
 
+static struct wmi_peer_param_map wmi_peer_param_map = {
+       .smps_state = WMI_PEER_SMPS_STATE,
+       .ampdu = WMI_PEER_AMPDU,
+       .authorize = WMI_PEER_AUTHORIZE,
+       .chan_width = WMI_PEER_CHAN_WIDTH,
+       .nss = WMI_PEER_NSS,
+       .use_4addr = WMI_PEER_USE_4ADDR,
+       .use_fixed_power = WMI_PEER_USE_FIXED_PWR,
+       .debug = WMI_PEER_DEBUG,
+       .phymode = WMI_PEER_PHYMODE,
+       .dummy_var = WMI_PEER_DUMMY_VAR,
+};
+
 /* MAIN WMI VDEV param map */
 static struct wmi_vdev_param_map wmi_vdev_param_map = {
        .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
@@ -9332,6 +9345,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.cmd = &wmi_10_4_cmd_map;
                ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
+               ar->wmi.peer_param = &wmi_peer_param_map;
                ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
                ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
@@ -9340,6 +9354,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.ops = &wmi_10_2_4_ops;
                ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
+               ar->wmi.peer_param = &wmi_peer_param_map;
                ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
                ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
@@ -9348,6 +9363,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.ops = &wmi_10_2_ops;
                ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
+               ar->wmi.peer_param = &wmi_peer_param_map;
                ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
                ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
@@ -9356,6 +9372,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.ops = &wmi_10_1_ops;
                ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
+               ar->wmi.peer_param = &wmi_peer_param_map;
                ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
                ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
@@ -9364,6 +9381,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.ops = &wmi_ops;
                ar->wmi.vdev_param = &wmi_vdev_param_map;
                ar->wmi.pdev_param = &wmi_pdev_param_map;
+               ar->wmi.peer_param = &wmi_peer_param_map;
                ar->wmi.peer_flags = &wmi_peer_flags_map;
                ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
index e80dbe7..fc95c0c 100644 (file)
@@ -5071,6 +5071,25 @@ enum wmi_rate_preamble {
 /* Value to disable fixed rate setting */
 #define WMI_FIXED_RATE_NONE    (0xff)
 
+struct wmi_peer_param_map {
+       u32 smps_state;
+       u32 ampdu;
+       u32 authorize;
+       u32 chan_width;
+       u32 nss;
+       u32 use_4addr;
+       u32 membership;
+       u32 use_fixed_power;
+       u32 user_pos;
+       u32 crit_proto_hint_enabled;
+       u32 tx_fail_cnt_thr;
+       u32 set_hw_retry_cts2s;
+       u32 ibss_atim_win_len;
+       u32 debug;
+       u32 phymode;
+       u32 dummy_var;
+};
+
 struct wmi_vdev_param_map {
        u32 rts_threshold;
        u32 fragmentation_threshold;