xref: /linux/drivers/net/wireless/ath/ath11k/hal_tx.c (revision 74c12ee02af109adcde36ec184fa59c0afb0edaa)
1d5c65159SKalle Valo // SPDX-License-Identifier: BSD-3-Clause-Clear
2d5c65159SKalle Valo /*
3d5c65159SKalle Valo  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4d5c65159SKalle Valo  */
5d5c65159SKalle Valo 
6d5c65159SKalle Valo #include "ahb.h"
7d5c65159SKalle Valo #include "hal.h"
8d5c65159SKalle Valo #include "hal_tx.h"
9d5c65159SKalle Valo 
10d5c65159SKalle Valo #define DSCP_TID_MAP_TBL_ENTRY_SIZE 64
11d5c65159SKalle Valo 
12d5c65159SKalle Valo /* dscp_tid_map - Default DSCP-TID mapping
13d5c65159SKalle Valo  *
14d5c65159SKalle Valo  * DSCP        TID
15d5c65159SKalle Valo  * 000000      0
16d5c65159SKalle Valo  * 001000      1
17d5c65159SKalle Valo  * 010000      2
18d5c65159SKalle Valo  * 011000      3
19d5c65159SKalle Valo  * 100000      4
20d5c65159SKalle Valo  * 101000      5
21d5c65159SKalle Valo  * 110000      6
22d5c65159SKalle Valo  * 111000      7
23d5c65159SKalle Valo  */
24d5c65159SKalle Valo static const u8 dscp_tid_map[DSCP_TID_MAP_TBL_ENTRY_SIZE] = {
25d5c65159SKalle Valo 	0, 0, 0, 0, 0, 0, 0, 0,
26d5c65159SKalle Valo 	1, 1, 1, 1, 1, 1, 1, 1,
27d5c65159SKalle Valo 	2, 2, 2, 2, 2, 2, 2, 2,
28d5c65159SKalle Valo 	3, 3, 3, 3, 3, 3, 3, 3,
29d5c65159SKalle Valo 	4, 4, 4, 4, 4, 4, 4, 4,
30d5c65159SKalle Valo 	5, 5, 5, 5, 5, 5, 5, 5,
31d5c65159SKalle Valo 	6, 6, 6, 6, 6, 6, 6, 6,
32d5c65159SKalle Valo 	7, 7, 7, 7, 7, 7, 7, 7,
33d5c65159SKalle Valo };
34d5c65159SKalle Valo 
35d5c65159SKalle Valo void ath11k_hal_tx_cmd_desc_setup(struct ath11k_base *ab, void *cmd,
36d5c65159SKalle Valo 				  struct hal_tx_info *ti)
37d5c65159SKalle Valo {
38d5c65159SKalle Valo 	struct hal_tcl_data_cmd *tcl_cmd = (struct hal_tcl_data_cmd *)cmd;
39d5c65159SKalle Valo 
40d5c65159SKalle Valo 	tcl_cmd->buf_addr_info.info0 =
41d5c65159SKalle Valo 		FIELD_PREP(BUFFER_ADDR_INFO0_ADDR, ti->paddr);
42d5c65159SKalle Valo 	tcl_cmd->buf_addr_info.info1 =
43d5c65159SKalle Valo 		FIELD_PREP(BUFFER_ADDR_INFO1_ADDR,
44d5c65159SKalle Valo 			   ((uint64_t)ti->paddr >> HAL_ADDR_MSB_REG_SHIFT));
45d5c65159SKalle Valo 	tcl_cmd->buf_addr_info.info1 |=
46d5c65159SKalle Valo 		FIELD_PREP(BUFFER_ADDR_INFO1_RET_BUF_MGR,
47d5c65159SKalle Valo 			   (ti->ring_id + HAL_RX_BUF_RBM_SW0_BM)) |
48d5c65159SKalle Valo 		FIELD_PREP(BUFFER_ADDR_INFO1_SW_COOKIE, ti->desc_id);
49d5c65159SKalle Valo 
50d5c65159SKalle Valo 	tcl_cmd->info0 =
51d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_DESC_TYPE, ti->type) |
52d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_ENCAP_TYPE, ti->encap_type) |
53d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_ENCRYPT_TYPE,
54d5c65159SKalle Valo 			   ti->encrypt_type) |
550f37fbf4SAnilkumar Kolli 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_SEARCH_TYPE,
560f37fbf4SAnilkumar Kolli 			   ti->search_type) |
570f37fbf4SAnilkumar Kolli 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_ADDR_EN,
58d5c65159SKalle Valo 			   ti->addr_search_flags) |
59d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_CMD_NUM,
60d5c65159SKalle Valo 			   ti->meta_data_flags);
61d5c65159SKalle Valo 
62d5c65159SKalle Valo 	tcl_cmd->info1 = ti->flags0 |
63d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO1_DATA_LEN, ti->data_len) |
64d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO1_PKT_OFFSET, ti->pkt_offset);
65d5c65159SKalle Valo 
66d5c65159SKalle Valo 	tcl_cmd->info2 = ti->flags1 |
67d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO2_TID, ti->tid) |
68d5c65159SKalle Valo 		FIELD_PREP(HAL_TCL_DATA_CMD_INFO2_LMAC_ID, ti->lmac_id);
69d5c65159SKalle Valo 
70d5c65159SKalle Valo 	tcl_cmd->info3 = FIELD_PREP(HAL_TCL_DATA_CMD_INFO3_DSCP_TID_TABLE_IDX,
71d5c65159SKalle Valo 				    ti->dscp_tid_tbl_idx) |
72d5c65159SKalle Valo 			 FIELD_PREP(HAL_TCL_DATA_CMD_INFO3_SEARCH_INDEX,
73d5c65159SKalle Valo 				    ti->bss_ast_hash);
74*bde4d95eSJohn Crispin 	tcl_cmd->info4 = 0;
75d5c65159SKalle Valo }
76d5c65159SKalle Valo 
77d5c65159SKalle Valo void ath11k_hal_tx_set_dscp_tid_map(struct ath11k_base *ab, int id)
78d5c65159SKalle Valo {
79d5c65159SKalle Valo 	u32 ctrl_reg_val;
80d5c65159SKalle Valo 	u32 addr;
81d5c65159SKalle Valo 	u8 hw_map_val[HAL_DSCP_TID_TBL_SIZE];
82d5c65159SKalle Valo 	int i;
83d5c65159SKalle Valo 	u32 value;
84d5c65159SKalle Valo 	int cnt = 0;
85d5c65159SKalle Valo 
86d5c65159SKalle Valo 	ctrl_reg_val = ath11k_ahb_read32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
87d5c65159SKalle Valo 					 HAL_TCL1_RING_CMN_CTRL_REG);
88d5c65159SKalle Valo 	/* Enable read/write access */
89d5c65159SKalle Valo 	ctrl_reg_val |= HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN;
90d5c65159SKalle Valo 	ath11k_ahb_write32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
91d5c65159SKalle Valo 			   HAL_TCL1_RING_CMN_CTRL_REG, ctrl_reg_val);
92d5c65159SKalle Valo 
93d5c65159SKalle Valo 	addr = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_DSCP_TID_MAP +
94d5c65159SKalle Valo 	       (4 * id * (HAL_DSCP_TID_TBL_SIZE / 4));
95d5c65159SKalle Valo 
96d5c65159SKalle Valo 	/* Configure each DSCP-TID mapping in three bits there by configure
97d5c65159SKalle Valo 	 * three bytes in an iteration.
98d5c65159SKalle Valo 	 */
99d5c65159SKalle Valo 	for (i = 0; i < DSCP_TID_MAP_TBL_ENTRY_SIZE; i += 8) {
100d5c65159SKalle Valo 		value = FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP0,
101d5c65159SKalle Valo 				   dscp_tid_map[i]) |
102d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP1,
103d5c65159SKalle Valo 				   dscp_tid_map[i + 1]) |
104d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP2,
105d5c65159SKalle Valo 				   dscp_tid_map[i + 2]) |
106d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP3,
107d5c65159SKalle Valo 				   dscp_tid_map[i + 3]) |
108d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP4,
109d5c65159SKalle Valo 				   dscp_tid_map[i + 4]) |
110d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP5,
111d5c65159SKalle Valo 				   dscp_tid_map[i + 5]) |
112d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP6,
113d5c65159SKalle Valo 				   dscp_tid_map[i + 6]) |
114d5c65159SKalle Valo 			FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP7,
115d5c65159SKalle Valo 				   dscp_tid_map[i + 7]);
116d5c65159SKalle Valo 		memcpy(&hw_map_val[cnt], (u8 *)&value, 3);
117d5c65159SKalle Valo 		cnt += 3;
118d5c65159SKalle Valo 	}
119d5c65159SKalle Valo 
120d5c65159SKalle Valo 	for (i = 0; i < HAL_DSCP_TID_TBL_SIZE; i += 4) {
121d5c65159SKalle Valo 		ath11k_ahb_write32(ab, addr, *(u32 *)&hw_map_val[i]);
122d5c65159SKalle Valo 		addr += 4;
123d5c65159SKalle Valo 	}
124d5c65159SKalle Valo 
125d5c65159SKalle Valo 	/* Disable read/write access */
126d5c65159SKalle Valo 	ctrl_reg_val = ath11k_ahb_read32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
127d5c65159SKalle Valo 					 HAL_TCL1_RING_CMN_CTRL_REG);
128d5c65159SKalle Valo 	ctrl_reg_val &= ~HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN;
129d5c65159SKalle Valo 	ath11k_ahb_write32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
130d5c65159SKalle Valo 			   HAL_TCL1_RING_CMN_CTRL_REG,
131d5c65159SKalle Valo 			   ctrl_reg_val);
132d5c65159SKalle Valo }
133d5c65159SKalle Valo 
134d5c65159SKalle Valo void ath11k_hal_tx_init_data_ring(struct ath11k_base *ab, struct hal_srng *srng)
135d5c65159SKalle Valo {
136d5c65159SKalle Valo 	struct hal_srng_params params;
137d5c65159SKalle Valo 	struct hal_tlv_hdr *tlv;
138d5c65159SKalle Valo 	int i, entry_size;
139d5c65159SKalle Valo 	u8 *desc;
140d5c65159SKalle Valo 
141d5c65159SKalle Valo 	memset(&params, 0, sizeof(params));
142d5c65159SKalle Valo 
143d5c65159SKalle Valo 	entry_size = ath11k_hal_srng_get_entrysize(HAL_TCL_DATA);
144d5c65159SKalle Valo 	ath11k_hal_srng_get_params(ab, srng, &params);
145d5c65159SKalle Valo 	desc = (u8 *)params.ring_base_vaddr;
146d5c65159SKalle Valo 
147d5c65159SKalle Valo 	for (i = 0; i < params.num_entries; i++) {
148d5c65159SKalle Valo 		tlv = (struct hal_tlv_hdr *)desc;
149d5c65159SKalle Valo 		tlv->tl = FIELD_PREP(HAL_TLV_HDR_TAG, HAL_TCL_DATA_CMD) |
150d5c65159SKalle Valo 			  FIELD_PREP(HAL_TLV_HDR_LEN,
151d5c65159SKalle Valo 				     sizeof(struct hal_tcl_data_cmd));
152d5c65159SKalle Valo 		desc += entry_size;
153d5c65159SKalle Valo 	}
154d5c65159SKalle Valo }
155