1 /* 2 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 #include "hal_hw_headers.h" 19 #include "hal_internal.h" 20 #include "cdp_txrx_mon_struct.h" 21 #include "qdf_trace.h" 22 #include "hal_rx.h" 23 #include "hal_tx.h" 24 #include "dp_types.h" 25 #include "hal_api_mon.h" 26 27 /** 28 * hal_tx_desc_set_dscp_tid_table_id_8074() - Sets DSCP to TID conversion 29 * table ID 30 * @desc: Handle to Tx Descriptor 31 * @id: DSCP to tid conversion table to be used for this frame 32 * 33 * Return: void 34 */ 35 36 static void hal_tx_desc_set_dscp_tid_table_id_8074(void *desc, uint8_t id) 37 { 38 HAL_SET_FLD(desc, TCL_DATA_CMD_3, 39 DSCP_TO_TID_PRIORITY_TABLE_ID) |= 40 HAL_TX_SM(TCL_DATA_CMD_3, 41 DSCP_TO_TID_PRIORITY_TABLE_ID, id); 42 } 43 44 /** 45 * hal_tx_set_dscp_tid_map_8074() - Configure default DSCP to TID map table 46 * @soc: HAL SoC context 47 * @map: DSCP-TID mapping table 48 * @id: mapping table ID - 0,1 49 * 50 * DSCP are mapped to 8 TID values using TID values programmed 51 * in two set of mapping registers DSCP_TID1_MAP_<0 to 6> (id = 0) 52 * and DSCP_TID2_MAP_<0 to 6> (id = 1) 53 * Each mapping register has TID mapping for 10 DSCP values 54 * 55 * Return: none 56 */ 57 static void hal_tx_set_dscp_tid_map_8074(struct hal_soc *soc, uint8_t *map, 58 uint8_t id) 59 { 60 int i; 61 uint32_t addr; 62 uint32_t value; 63 64 if (id == HAL_TX_DSCP_TID_MAP_TABLE_DEFAULT) { 65 addr = HWIO_TCL_R0_DSCP_TID1_MAP_0_ADDR( 66 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 67 } else { 68 addr = HWIO_TCL_R0_DSCP_TID2_MAP_0_ADDR( 69 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 70 } 71 72 for (i = 0; i < 64; i += 10) { 73 value = 74 (map[i] | 75 (map[i + 1] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_1_SHFT) | 76 (map[i + 2] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_2_SHFT) | 77 (map[i + 3] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_3_SHFT) | 78 (map[i + 4] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_4_SHFT) | 79 (map[i + 5] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_5_SHFT) | 80 (map[i + 6] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_6_SHFT) | 81 (map[i + 7] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_7_SHFT) | 82 (map[i + 8] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_8_SHFT) | 83 (map[i + 9] << HWIO_TCL_R0_DSCP_TID1_MAP_0_DSCP_9_SHFT)); 84 85 HAL_REG_WRITE(soc, addr, 86 (value & HWIO_TCL_R0_DSCP_TID1_MAP_1_RMSK)); 87 88 addr += 4; 89 } 90 } 91 92 /** 93 * hal_tx_update_dscp_tid_8074() - Update the dscp tid map table as 94 updated by user 95 * @soc: HAL SoC context 96 * @map: DSCP-TID mapping table 97 * @id : MAP ID 98 * @dscp: DSCP_TID map index 99 * 100 * Return: void 101 */ 102 static 103 void hal_tx_update_dscp_tid_8074(struct hal_soc *soc, uint8_t tid, 104 uint8_t id, uint8_t dscp) 105 { 106 int index; 107 uint32_t addr; 108 uint32_t value; 109 uint32_t regval; 110 111 if (id == HAL_TX_DSCP_TID_MAP_TABLE_DEFAULT) 112 addr = HWIO_TCL_R0_DSCP_TID1_MAP_0_ADDR( 113 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 114 else 115 addr = HWIO_TCL_R0_DSCP_TID2_MAP_0_ADDR( 116 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 117 118 index = dscp % HAL_TX_NUM_DSCP_PER_REGISTER; 119 addr += 4 * (dscp / HAL_TX_NUM_DSCP_PER_REGISTER); 120 value = tid << (HAL_TX_BITS_PER_TID * index); 121 122 /* Read back previous DSCP TID config and update 123 * with new config. 124 */ 125 regval = HAL_REG_READ(soc, addr); 126 regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * index)); 127 regval |= value; 128 129 HAL_REG_WRITE(soc, addr, 130 (regval & HWIO_TCL_R0_DSCP_TID1_MAP_1_RMSK)); 131 } 132 133 /** 134 * hal_tx_desc_set_lmac_id - Set the lmac_id value 135 * @desc: Handle to Tx Descriptor 136 * @lmac_id: mac Id to ast matching 137 * b00 – mac 0 138 * b01 – mac 1 139 * b10 – mac 2 140 * b11 – all macs (legacy HK way) 141 * 142 * Return: void 143 */ 144 static void hal_tx_desc_set_lmac_id_8074(void *desc, uint8_t lmac_id) 145 { 146 } 147 148 /** 149 * hal_tx_init_cmd_credit_ring_8074v1() - Initialize command/credit SRNG 150 * @hal_soc_hdl: Handle to HAL SoC structure 151 * @hal_srng: Handle to HAL SRNG structure 152 * 153 * Return: none 154 */ 155 static inline void hal_tx_init_cmd_credit_ring_8074v1(hal_soc_handle_t hal_soc_hdl, 156 hal_ring_handle_t hal_ring_hdl) 157 { 158 uint8_t *desc_addr; 159 struct hal_srng_params srng_params; 160 uint32_t desc_size; 161 uint32_t num_desc; 162 163 hal_get_srng_params(hal_soc_hdl, hal_ring_hdl, &srng_params); 164 165 desc_addr = (uint8_t *)srng_params.ring_base_vaddr; 166 desc_size = sizeof(struct tcl_data_cmd); 167 num_desc = srng_params.num_entries; 168 169 while (num_desc) { 170 /* using CMD/CREDIT Ring to send DATA CMD tag */ 171 HAL_TX_DESC_SET_TLV_HDR(desc_addr, WIFITCL_DATA_CMD_E, 172 desc_size); 173 desc_addr += (desc_size + sizeof(struct tlv_32_hdr)); 174 num_desc--; 175 } 176 } 177