Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ath10k: Add peer param map for tlv and non-tlv

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>

authored by

Rakesh Pillai and committed by
Kalle Valo
c0e33fe6 3f14b73c

+84 -9
+1
drivers/net/wireless/ath/ath10k/core.h
··· 169 169 struct wmi_cmd_map *cmd; 170 170 struct wmi_vdev_param_map *vdev_param; 171 171 struct wmi_pdev_param_map *pdev_param; 172 + struct wmi_peer_param_map *peer_param; 172 173 const struct wmi_ops *ops; 173 174 const struct wmi_peer_flags_map *peer_flags; 174 175
+1 -1
drivers/net/wireless/ath/ath10k/debugfs_sta.c
··· 430 430 } 431 431 432 432 ret = ath10k_wmi_peer_set_param(ar, arsta->arvif->vdev_id, sta->addr, 433 - WMI_PEER_DEBUG, peer_debug_trigger); 433 + ar->wmi.peer_param->debug, peer_debug_trigger); 434 434 if (ret) { 435 435 ath10k_warn(ar, "failed to set param to trigger peer tid logs for station ret: %d\n", 436 436 ret);
+8 -8
drivers/net/wireless/ath/ath10k/mac.c
··· 2773 2773 return -EINVAL; 2774 2774 2775 2775 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr, 2776 - WMI_PEER_SMPS_STATE, 2776 + ar->wmi.peer_param->smps_state, 2777 2777 ath10k_smps_map[smps]); 2778 2778 } 2779 2779 ··· 2930 2930 * poked with peer param command. 2931 2931 */ 2932 2932 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid, 2933 - WMI_PEER_DUMMY_VAR, 1); 2933 + ar->wmi.peer_param->dummy_var, 1); 2934 2934 if (ret) { 2935 2935 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n", 2936 2936 arvif->bssid, arvif->vdev_id, ret); ··· 6249 6249 6250 6250 if (sta && sta->tdls) 6251 6251 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, 6252 - WMI_PEER_AUTHORIZE, 1); 6252 + ar->wmi.peer_param->authorize, 1); 6253 6253 6254 6254 exit: 6255 6255 mutex_unlock(&ar->conf_mutex); ··· 6340 6340 sta->addr, bw, mode); 6341 6341 6342 6342 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, 6343 - WMI_PEER_PHYMODE, mode); 6343 + ar->wmi.peer_param->phymode, mode); 6344 6344 if (err) { 6345 6345 ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n", 6346 6346 sta->addr, mode, err); ··· 6348 6348 } 6349 6349 6350 6350 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, 6351 - WMI_PEER_CHAN_WIDTH, bw); 6351 + ar->wmi.peer_param->chan_width, bw); 6352 6352 if (err) 6353 6353 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n", 6354 6354 sta->addr, bw, err); ··· 6359 6359 sta->addr, nss); 6360 6360 6361 6361 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, 6362 - WMI_PEER_NSS, nss); 6362 + ar->wmi.peer_param->nss, nss); 6363 6363 if (err) 6364 6364 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n", 6365 6365 sta->addr, nss, err); ··· 6370 6370 sta->addr, smps); 6371 6371 6372 6372 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, 6373 - WMI_PEER_SMPS_STATE, smps); 6373 + ar->wmi.peer_param->smps_state, smps); 6374 6374 if (err) 6375 6375 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n", 6376 6376 sta->addr, smps, err); ··· 6444 6444 mutex_lock(&ar->conf_mutex); 6445 6445 6446 6446 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr, 6447 - WMI_PEER_USE_FIXED_PWR, txpwr); 6447 + ar->wmi.peer_param->use_fixed_power, txpwr); 6448 6448 if (ret) { 6449 6449 ath10k_warn(ar, "failed to set tx power for station ret: %d\n", 6450 6450 ret);
+19
drivers/net/wireless/ath/ath10k/wmi-tlv.c
··· 4206 4206 .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 4207 4207 }; 4208 4208 4209 + static struct wmi_peer_param_map wmi_tlv_peer_param_map = { 4210 + .smps_state = WMI_TLV_PEER_SMPS_STATE, 4211 + .ampdu = WMI_TLV_PEER_AMPDU, 4212 + .authorize = WMI_TLV_PEER_AUTHORIZE, 4213 + .chan_width = WMI_TLV_PEER_CHAN_WIDTH, 4214 + .nss = WMI_TLV_PEER_NSS, 4215 + .use_4addr = WMI_TLV_PEER_USE_4ADDR, 4216 + .membership = WMI_TLV_PEER_MEMBERSHIP, 4217 + .user_pos = WMI_TLV_PEER_USERPOS, 4218 + .crit_proto_hint_enabled = WMI_TLV_PEER_CRIT_PROTO_HINT_ENABLED, 4219 + .tx_fail_cnt_thr = WMI_TLV_PEER_TX_FAIL_CNT_THR, 4220 + .set_hw_retry_cts2s = WMI_TLV_PEER_SET_HW_RETRY_CTS2S, 4221 + .ibss_atim_win_len = WMI_TLV_PEER_IBSS_ATIM_WINDOW_LENGTH, 4222 + .phymode = WMI_TLV_PEER_PHYMODE, 4223 + .use_fixed_power = WMI_TLV_PEER_USE_FIXED_PWR, 4224 + .dummy_var = WMI_TLV_PEER_DUMMY_VAR, 4225 + }; 4226 + 4209 4227 static struct wmi_vdev_param_map wmi_tlv_vdev_param_map = { 4210 4228 .rts_threshold = WMI_TLV_VDEV_PARAM_RTS_THRESHOLD, 4211 4229 .fragmentation_threshold = WMI_TLV_VDEV_PARAM_FRAGMENTATION_THRESHOLD, ··· 4412 4394 ar->wmi.cmd = &wmi_tlv_cmd_map; 4413 4395 ar->wmi.vdev_param = &wmi_tlv_vdev_param_map; 4414 4396 ar->wmi.pdev_param = &wmi_tlv_pdev_param_map; 4397 + ar->wmi.peer_param = &wmi_tlv_peer_param_map; 4415 4398 ar->wmi.ops = &wmi_tlv_ops; 4416 4399 ar->wmi.peer_flags = &wmi_tlv_peer_flags_map; 4417 4400 }
+18
drivers/net/wireless/ath/ath10k/wmi-tlv.h
··· 528 528 WMI_TLV_VDEV_PARAM_IBSS_PS_1RX_CHAIN_IN_ATIM_WINDOW_ENABLE, 529 529 }; 530 530 531 + enum wmi_tlv_peer_param { 532 + WMI_TLV_PEER_SMPS_STATE = 0x1, /* see %wmi_peer_smps_state */ 533 + WMI_TLV_PEER_AMPDU = 0x2, 534 + WMI_TLV_PEER_AUTHORIZE = 0x3, 535 + WMI_TLV_PEER_CHAN_WIDTH = 0x4, 536 + WMI_TLV_PEER_NSS = 0x5, 537 + WMI_TLV_PEER_USE_4ADDR = 0x6, 538 + WMI_TLV_PEER_MEMBERSHIP = 0x7, 539 + WMI_TLV_PEER_USERPOS = 0x8, 540 + WMI_TLV_PEER_CRIT_PROTO_HINT_ENABLED = 0x9, 541 + WMI_TLV_PEER_TX_FAIL_CNT_THR = 0xa, 542 + WMI_TLV_PEER_SET_HW_RETRY_CTS2S = 0xb, 543 + WMI_TLV_PEER_IBSS_ATIM_WINDOW_LENGTH = 0xc, 544 + WMI_TLV_PEER_PHYMODE = 0xd, 545 + WMI_TLV_PEER_USE_FIXED_PWR = 0xe, 546 + WMI_TLV_PEER_DUMMY_VAR = 0xff, 547 + }; 548 + 531 549 enum wmi_tlv_peer_flags { 532 550 WMI_TLV_PEER_AUTH = 0x00000001, 533 551 WMI_TLV_PEER_QOS = 0x00000002,
+18
drivers/net/wireless/ath/ath10k/wmi.c
··· 742 742 .radar_found_cmdid = WMI_10_4_RADAR_FOUND_CMDID, 743 743 }; 744 744 745 + static struct wmi_peer_param_map wmi_peer_param_map = { 746 + .smps_state = WMI_PEER_SMPS_STATE, 747 + .ampdu = WMI_PEER_AMPDU, 748 + .authorize = WMI_PEER_AUTHORIZE, 749 + .chan_width = WMI_PEER_CHAN_WIDTH, 750 + .nss = WMI_PEER_NSS, 751 + .use_4addr = WMI_PEER_USE_4ADDR, 752 + .use_fixed_power = WMI_PEER_USE_FIXED_PWR, 753 + .debug = WMI_PEER_DEBUG, 754 + .phymode = WMI_PEER_PHYMODE, 755 + .dummy_var = WMI_PEER_DUMMY_VAR, 756 + }; 757 + 745 758 /* MAIN WMI VDEV param map */ 746 759 static struct wmi_vdev_param_map wmi_vdev_param_map = { 747 760 .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD, ··· 9345 9332 ar->wmi.cmd = &wmi_10_4_cmd_map; 9346 9333 ar->wmi.vdev_param = &wmi_10_4_vdev_param_map; 9347 9334 ar->wmi.pdev_param = &wmi_10_4_pdev_param_map; 9335 + ar->wmi.peer_param = &wmi_peer_param_map; 9348 9336 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 9349 9337 ar->wmi_key_cipher = wmi_key_cipher_suites; 9350 9338 break; ··· 9354 9340 ar->wmi.ops = &wmi_10_2_4_ops; 9355 9341 ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map; 9356 9342 ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map; 9343 + ar->wmi.peer_param = &wmi_peer_param_map; 9357 9344 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 9358 9345 ar->wmi_key_cipher = wmi_key_cipher_suites; 9359 9346 break; ··· 9363 9348 ar->wmi.ops = &wmi_10_2_ops; 9364 9349 ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 9365 9350 ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 9351 + ar->wmi.peer_param = &wmi_peer_param_map; 9366 9352 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 9367 9353 ar->wmi_key_cipher = wmi_key_cipher_suites; 9368 9354 break; ··· 9372 9356 ar->wmi.ops = &wmi_10_1_ops; 9373 9357 ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 9374 9358 ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 9359 + ar->wmi.peer_param = &wmi_peer_param_map; 9375 9360 ar->wmi.peer_flags = &wmi_10x_peer_flags_map; 9376 9361 ar->wmi_key_cipher = wmi_key_cipher_suites; 9377 9362 break; ··· 9381 9364 ar->wmi.ops = &wmi_ops; 9382 9365 ar->wmi.vdev_param = &wmi_vdev_param_map; 9383 9366 ar->wmi.pdev_param = &wmi_pdev_param_map; 9367 + ar->wmi.peer_param = &wmi_peer_param_map; 9384 9368 ar->wmi.peer_flags = &wmi_peer_flags_map; 9385 9369 ar->wmi_key_cipher = wmi_key_cipher_suites; 9386 9370 break;
+19
drivers/net/wireless/ath/ath10k/wmi.h
··· 5071 5071 /* Value to disable fixed rate setting */ 5072 5072 #define WMI_FIXED_RATE_NONE (0xff) 5073 5073 5074 + struct wmi_peer_param_map { 5075 + u32 smps_state; 5076 + u32 ampdu; 5077 + u32 authorize; 5078 + u32 chan_width; 5079 + u32 nss; 5080 + u32 use_4addr; 5081 + u32 membership; 5082 + u32 use_fixed_power; 5083 + u32 user_pos; 5084 + u32 crit_proto_hint_enabled; 5085 + u32 tx_fail_cnt_thr; 5086 + u32 set_hw_retry_cts2s; 5087 + u32 ibss_atim_win_len; 5088 + u32 debug; 5089 + u32 phymode; 5090 + u32 dummy_var; 5091 + }; 5092 + 5074 5093 struct wmi_vdev_param_map { 5075 5094 u32 rts_threshold; 5076 5095 u32 fragmentation_threshold;