Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1116,6 +1116,13 @@ static int ath10k_core_init_firmware_features(struct ath10k *ar)
			WMI_STAT_PEER;
		break;
	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_MAX:
		WARN_ON(1);
+2 −0
Original line number Diff line number Diff line
@@ -684,6 +684,8 @@ struct ath10k {
	int max_num_stations;
	int max_num_vdevs;
	int max_num_tdls_vdevs;
	int num_active_peers;
	int num_tids;

	struct work_struct offchan_tx_work;
	struct sk_buff_head offchan_tx_queue;
+54 −0
Original line number Diff line number Diff line
@@ -354,6 +354,60 @@ enum ath10k_hw_rate_cck {

#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 */
#define CE_COUNT ar->hw_values->ce_count

+83 −0
Original line number Diff line number Diff line
@@ -4641,6 +4641,88 @@ static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
	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)
{
	if (arg->ie_len && !arg->ie)
@@ -6105,6 +6187,7 @@ static const struct wmi_ops wmi_10_2_4_ops = {

static const struct wmi_ops wmi_10_4_ops = {
	.map_svc = wmi_10_4_svc_map,
	.gen_init = ath10k_wmi_10_4_op_gen_init,
};

int ath10k_wmi_attach(struct ath10k *ar)
+220 −0
Original line number Diff line number Diff line
@@ -2380,6 +2380,221 @@ struct wmi_resource_config_10_2 {
#define NUM_UNITS_IS_NUM_VDEVS   0x1
#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. */
struct host_memory_chunk {
	/* id of the request that is passed up in service ready */
@@ -2412,6 +2627,11 @@ struct wmi_init_cmd_10_2 {
	struct wmi_host_mem_chunks mem_chunks;
} __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 {
	__le16 freq;
	u8 phy_mode; /* valid for 10.2 only */