Commit d1e52a8e authored by Raja Mani's avatar Raja Mani Committed by Kalle Valo

ath10k: fill 10.4 fw wmi init cmd default values

Define 10.4 wmi init command structure and introduce new function
ath10k_wmi_10_4_op_gen_init() to fill default values for each field
which goes as part of wmi init cmd to 10.4 firmware.
Signed-off-by: default avatarRaja Mani <rmani@qti.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent d86561ff
...@@ -1116,6 +1116,13 @@ static int ath10k_core_init_firmware_features(struct ath10k *ar) ...@@ -1116,6 +1116,13 @@ static int ath10k_core_init_firmware_features(struct ath10k *ar)
WMI_STAT_PEER; WMI_STAT_PEER;
break; break;
case ATH10K_FW_WMI_OP_VERSION_10_4: case ATH10K_FW_WMI_OP_VERSION_10_4:
ar->max_num_peers = TARGET_10_4_NUM_PEERS;
ar->max_num_stations = TARGET_10_4_NUM_STATIONS;
ar->num_active_peers = TARGET_10_4_ACTIVE_PEERS;
ar->max_num_vdevs = TARGET_10_4_NUM_VDEVS;
ar->num_tids = TARGET_10_4_TGT_NUM_TIDS;
ar->fw_stats_req_mask = WMI_STAT_PEER;
break;
case ATH10K_FW_WMI_OP_VERSION_UNSET: case ATH10K_FW_WMI_OP_VERSION_UNSET:
case ATH10K_FW_WMI_OP_VERSION_MAX: case ATH10K_FW_WMI_OP_VERSION_MAX:
WARN_ON(1); WARN_ON(1);
......
...@@ -684,6 +684,8 @@ struct ath10k { ...@@ -684,6 +684,8 @@ struct ath10k {
int max_num_stations; int max_num_stations;
int max_num_vdevs; int max_num_vdevs;
int max_num_tdls_vdevs; int max_num_tdls_vdevs;
int num_active_peers;
int num_tids;
struct work_struct offchan_tx_work; struct work_struct offchan_tx_work;
struct sk_buff_head offchan_tx_queue; struct sk_buff_head offchan_tx_queue;
......
...@@ -354,6 +354,60 @@ enum ath10k_hw_rate_cck { ...@@ -354,6 +354,60 @@ enum ath10k_hw_rate_cck {
#define NUM_TARGET_CE_CONFIG_WLAN ar->hw_values->num_target_ce_config_wlan #define NUM_TARGET_CE_CONFIG_WLAN ar->hw_values->num_target_ce_config_wlan
/* Target specific defines for 10.4 firmware */
#define TARGET_10_4_NUM_VDEVS 16
#define TARGET_10_4_NUM_STATIONS 32
#define TARGET_10_4_NUM_PEERS ((TARGET_10_4_NUM_STATIONS) + \
(TARGET_10_4_NUM_VDEVS))
#define TARGET_10_4_ACTIVE_PEERS 0
#define TARGET_10_4_NUM_OFFLOAD_PEERS 0
#define TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS 0
#define TARGET_10_4_NUM_PEER_KEYS 2
#define TARGET_10_4_TGT_NUM_TIDS ((TARGET_10_4_NUM_PEERS) * 2)
#define TARGET_10_4_AST_SKID_LIMIT 32
#define TARGET_10_4_TX_CHAIN_MASK (BIT(0) | BIT(1) | \
BIT(2) | BIT(3))
#define TARGET_10_4_RX_CHAIN_MASK (BIT(0) | BIT(1) | \
BIT(2) | BIT(3))
/* 100 ms for video, best-effort, and background */
#define TARGET_10_4_RX_TIMEOUT_LO_PRI 100
/* 40 ms for voice */
#define TARGET_10_4_RX_TIMEOUT_HI_PRI 40
#define TARGET_10_4_RX_DECAP_MODE ATH10K_HW_TXRX_NATIVE_WIFI
#define TARGET_10_4_SCAN_MAX_REQS 4
#define TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV 3
#define TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV 3
#define TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES 8
/* Note: mcast to ucast is disabled by default */
#define TARGET_10_4_NUM_MCAST_GROUPS 0
#define TARGET_10_4_NUM_MCAST_TABLE_ELEMS 0
#define TARGET_10_4_MCAST2UCAST_MODE 0
#define TARGET_10_4_TX_DBG_LOG_SIZE 1024
#define TARGET_10_4_NUM_WDS_ENTRIES 32
#define TARGET_10_4_DMA_BURST_SIZE 1
#define TARGET_10_4_MAC_AGGR_DELIM 0
#define TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1
#define TARGET_10_4_VOW_CONFIG 0
#define TARGET_10_4_GTK_OFFLOAD_MAX_VDEV 3
#define TARGET_10_4_NUM_MSDU_DESC (1024 + 400)
#define TARGET_10_4_11AC_TX_MAX_FRAGS 2
#define TARGET_10_4_MAX_PEER_EXT_STATS 16
#define TARGET_10_4_SMART_ANT_CAP 0
#define TARGET_10_4_BK_MIN_FREE 0
#define TARGET_10_4_BE_MIN_FREE 0
#define TARGET_10_4_VI_MIN_FREE 0
#define TARGET_10_4_VO_MIN_FREE 0
#define TARGET_10_4_RX_BATCH_MODE 1
#define TARGET_10_4_THERMAL_THROTTLING_CONFIG 0
#define TARGET_10_4_ATF_CONFIG 0
#define TARGET_10_4_IPHDR_PAD_CONFIG 1
#define TARGET_10_4_QWRAP_CONFIG 0
/* Number of Copy Engines supported */ /* Number of Copy Engines supported */
#define CE_COUNT ar->hw_values->ce_count #define CE_COUNT ar->hw_values->ce_count
......
...@@ -4641,6 +4641,88 @@ static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar) ...@@ -4641,6 +4641,88 @@ static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
return buf; return buf;
} }
static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
{
struct wmi_init_cmd_10_4 *cmd;
struct sk_buff *buf;
struct wmi_resource_config_10_4 config = {};
u32 len;
config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
config.num_peers = __cpu_to_le32(ar->max_num_peers);
config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
config.num_tids = __cpu_to_le32(ar->num_tids);
config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS);
config.num_offload_reorder_buffs =
__cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS);
config.num_peer_keys = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS);
config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT);
config.tx_chain_mask = __cpu_to_le32(TARGET_10_4_TX_CHAIN_MASK);
config.rx_chain_mask = __cpu_to_le32(TARGET_10_4_RX_CHAIN_MASK);
config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI);
config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI);
config.rx_decap_mode = __cpu_to_le32(TARGET_10_4_RX_DECAP_MODE);
config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS);
config.bmiss_offload_max_vdev =
__cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV);
config.roam_offload_max_vdev =
__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV);
config.roam_offload_max_ap_profiles =
__cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES);
config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS);
config.num_mcast_table_elems =
__cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS);
config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE);
config.tx_dbg_log_size = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE);
config.num_wds_entries = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES);
config.dma_burst_size = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE);
config.mac_aggr_delim = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM);
config.rx_skip_defrag_timeout_dup_detection_check =
__cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK);
config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG);
config.gtk_offload_max_vdev =
__cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV);
config.num_msdu_desc = __cpu_to_le32(TARGET_10_4_NUM_MSDU_DESC);
config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS);
config.max_peer_ext_stats =
__cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS);
config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP);
config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE);
config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE);
config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE);
config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE);
config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE);
config.tt_support =
__cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG);
config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG);
config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG);
config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG);
len = sizeof(*cmd) +
(sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
buf = ath10k_wmi_alloc_skb(ar, len);
if (!buf)
return ERR_PTR(-ENOMEM);
cmd = (struct wmi_init_cmd_10_4 *)buf->data;
memcpy(&cmd->resource_config, &config, sizeof(config));
ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
return buf;
}
int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg) int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg)
{ {
if (arg->ie_len && !arg->ie) if (arg->ie_len && !arg->ie)
...@@ -6105,6 +6187,7 @@ static const struct wmi_ops wmi_10_2_4_ops = { ...@@ -6105,6 +6187,7 @@ static const struct wmi_ops wmi_10_2_4_ops = {
static const struct wmi_ops wmi_10_4_ops = { static const struct wmi_ops wmi_10_4_ops = {
.map_svc = wmi_10_4_svc_map, .map_svc = wmi_10_4_svc_map,
.gen_init = ath10k_wmi_10_4_op_gen_init,
}; };
int ath10k_wmi_attach(struct ath10k *ar) int ath10k_wmi_attach(struct ath10k *ar)
......
...@@ -2380,6 +2380,221 @@ struct wmi_resource_config_10_2 { ...@@ -2380,6 +2380,221 @@ struct wmi_resource_config_10_2 {
#define NUM_UNITS_IS_NUM_VDEVS 0x1 #define NUM_UNITS_IS_NUM_VDEVS 0x1
#define NUM_UNITS_IS_NUM_PEERS 0x2 #define NUM_UNITS_IS_NUM_PEERS 0x2
struct wmi_resource_config_10_4 {
/* Number of virtual devices (VAPs) to support */
__le32 num_vdevs;
/* Number of peer nodes to support */
__le32 num_peers;
/* Number of active peer nodes to support */
__le32 num_active_peers;
/* In offload mode, target supports features like WOW, chatter and other
* protocol offloads. In order to support them some functionalities like
* reorder buffering, PN checking need to be done in target.
* This determines maximum number of peers supported by target in
* offload mode.
*/
__le32 num_offload_peers;
/* Number of reorder buffers available for doing target based reorder
* Rx reorder buffering
*/
__le32 num_offload_reorder_buffs;
/* Number of keys per peer */
__le32 num_peer_keys;
/* Total number of TX/RX data TIDs */
__le32 num_tids;
/* Max skid for resolving hash collisions.
* The address search table is sparse, so that if two MAC addresses
* result in the same hash value, the second of these conflicting
* entries can slide to the next index in the address search table,
* and use it, if it is unoccupied. This ast_skid_limit parameter
* specifies the upper bound on how many subsequent indices to search
* over to find an unoccupied space.
*/
__le32 ast_skid_limit;
/* The nominal chain mask for transmit.
* The chain mask may be modified dynamically, e.g. to operate AP tx
* with a reduced number of chains if no clients are associated.
* This configuration parameter specifies the nominal chain-mask that
* should be used when not operating with a reduced set of tx chains.
*/
__le32 tx_chain_mask;
/* The nominal chain mask for receive.
* The chain mask may be modified dynamically, e.g. for a client to use
* a reduced number of chains for receive if the traffic to the client
* is low enough that it doesn't require downlink MIMO or antenna
* diversity. This configuration parameter specifies the nominal
* chain-mask that should be used when not operating with a reduced
* set of rx chains.
*/
__le32 rx_chain_mask;
/* What rx reorder timeout (ms) to use for the AC.
* Each WMM access class (voice, video, best-effort, background) will
* have its own timeout value to dictate how long to wait for missing
* rx MPDUs to arrive before flushing subsequent MPDUs that have already
* been received. This parameter specifies the timeout in milliseconds
* for each class.
*/
__le32 rx_timeout_pri[4];
/* What mode the rx should decap packets to.
* MAC can decap to RAW (no decap), native wifi or Ethernet types.
* This setting also determines the default TX behavior, however TX
* behavior can be modified on a per VAP basis during VAP init
*/
__le32 rx_decap_mode;
__le32 scan_max_pending_req;
__le32 bmiss_offload_max_vdev;
__le32 roam_offload_max_vdev;
__le32 roam_offload_max_ap_profiles;
/* How many groups to use for mcast->ucast conversion.
* The target's WAL maintains a table to hold information regarding
* which peers belong to a given multicast group, so that if
* multicast->unicast conversion is enabled, the target can convert
* multicast tx frames to a series of unicast tx frames, to each peer
* within the multicast group. This num_mcast_groups configuration
* parameter tells the target how many multicast groups to provide
* storage for within its multicast group membership table.
*/
__le32 num_mcast_groups;
/* Size to alloc for the mcast membership table.
* This num_mcast_table_elems configuration parameter tells the target
* how many peer elements it needs to provide storage for in its
* multicast group membership table. These multicast group membership
* table elements are shared by the multicast groups stored within
* the table.
*/
__le32 num_mcast_table_elems;
/* Whether/how to do multicast->unicast conversion.
* This configuration parameter specifies whether the target should
* perform multicast --> unicast conversion on transmit, and if so,
* what to do if it finds no entries in its multicast group membership
* table for the multicast IP address in the tx frame.
* Configuration value:
* 0 -> Do not perform multicast to unicast conversion.
* 1 -> Convert multicast frames to unicast, if the IP multicast address
* from the tx frame is found in the multicast group membership
* table. If the IP multicast address is not found, drop the frame
* 2 -> Convert multicast frames to unicast, if the IP multicast address
* from the tx frame is found in the multicast group membership
* table. If the IP multicast address is not found, transmit the
* frame as multicast.
*/
__le32 mcast2ucast_mode;
/* How much memory to allocate for a tx PPDU dbg log.
* This parameter controls how much memory the target will allocate to
* store a log of tx PPDU meta-information (how large the PPDU was,
* when it was sent, whether it was successful, etc.)
*/
__le32 tx_dbg_log_size;
/* How many AST entries to be allocated for WDS */
__le32 num_wds_entries;
/* MAC DMA burst size. 0 -default, 1 -256B */
__le32 dma_burst_size;
/* Fixed delimiters to be inserted after every MPDU to account for
* interface latency to avoid underrun.
*/
__le32 mac_aggr_delim;
/* Determine whether target is responsible for detecting duplicate
* non-aggregate MPDU and timing out stale fragments. A-MPDU reordering
* is always performed on the target.
*
* 0: target responsible for frag timeout and dup checking
* 1: host responsible for frag timeout and dup checking
*/
__le32 rx_skip_defrag_timeout_dup_detection_check;
/* Configuration for VoW : No of Video nodes to be supported and max
* no of descriptors for each video link (node).
*/
__le32 vow_config;
/* Maximum vdev that could use gtk offload */
__le32 gtk_offload_max_vdev;
/* Number of msdu descriptors target should use */
__le32 num_msdu_desc;
/* Max number of tx fragments per MSDU.
* This parameter controls the max number of tx fragments per MSDU.
* This will passed by target as part of the WMI_SERVICE_READY event
* and is overridden by the OS shim as required.
*/
__le32 max_frag_entries;
/* Max number of extended peer stats.
* This parameter controls the max number of peers for which extended
* statistics are supported by target
*/
__le32 max_peer_ext_stats;
/* Smart antenna capabilities information.
* 1 - Smart antenna is enabled
* 0 - Smart antenna is disabled
* In future this can contain smart antenna specific capabilities.
*/
__le32 smart_ant_cap;
/* User can configure the buffers allocated for each AC (BE, BK, VI, VO)
* during init.
*/
__le32 bk_minfree;
__le32 be_minfree;
__le32 vi_minfree;
__le32 vo_minfree;
/* Rx batch mode capability.
* 1 - Rx batch mode enabled
* 0 - Rx batch mode disabled
*/
__le32 rx_batchmode;
/* Thermal throttling capability.
* 1 - Capable of thermal throttling
* 0 - Not capable of thermal throttling
*/
__le32 tt_support;
/* ATF configuration.
* 1 - Enable ATF
* 0 - Disable ATF
*/
__le32 atf_config;
/* Configure padding to manage IP header un-alignment
* 1 - Enable padding
* 0 - Disable padding
*/
__le32 iphdr_pad_config;
/* qwrap configuration
* 1 - This is qwrap configuration
* 0 - This is not qwrap
*/
__le32 qwrap_config;
} __packed;
/* strucutre describing host memory chunk. */ /* strucutre describing host memory chunk. */
struct host_memory_chunk { struct host_memory_chunk {
/* id of the request that is passed up in service ready */ /* id of the request that is passed up in service ready */
...@@ -2412,6 +2627,11 @@ struct wmi_init_cmd_10_2 { ...@@ -2412,6 +2627,11 @@ struct wmi_init_cmd_10_2 {
struct wmi_host_mem_chunks mem_chunks; struct wmi_host_mem_chunks mem_chunks;
} __packed; } __packed;
struct wmi_init_cmd_10_4 {
struct wmi_resource_config_10_4 resource_config;
struct wmi_host_mem_chunks mem_chunks;
} __packed;
struct wmi_chan_list_entry { struct wmi_chan_list_entry {
__le16 freq; __le16 freq;
u8 phy_mode; /* valid for 10.2 only */ u8 phy_mode; /* valid for 10.2 only */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment