xref: /wlan-dirver/qca-wifi-host-cmn/target_if/dp/src/target_if_dp.c (revision 1397a33f48ea6455be40871470b286e535820eb8)
1 /*
2  * Copyright (c) 2018 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 
19 /**
20  * DOC: defines DP interaction with FW using WMI
21  */
22 
23 #include <qdf_status.h>
24 #include "target_if_dp.h"
25 #include <init_deinit_lmac.h>
26 
27 void
28 target_if_peer_set_default_routing(struct cdp_ctrl_objmgr_pdev *pdev,
29 				   uint8_t *peer_macaddr, uint8_t vdev_id,
30 				   bool hash_based, uint8_t ring_num)
31 {
32 	uint32_t value;
33 	struct peer_set_params param;
34 	struct common_wmi_handle *pdev_wmi_handle;
35 
36 	pdev_wmi_handle =
37 		lmac_get_pdev_wmi_handle((struct wlan_objmgr_pdev *)pdev);
38 	if (!pdev_wmi_handle) {
39 		target_if_err("pdev wmi handle NULL");
40 		return;
41 	}
42 
43 	qdf_mem_set(&param, sizeof(param), 0);
44 
45 	/* TODO: Need bit definitions for ring number and hash based routing
46 	 * fields in common wmi header file
47 	 */
48 	value = ((hash_based) ? 1 : 0) | (ring_num << 1);
49 
50 	param.param_id = WMI_HOST_PEER_SET_DEFAULT_ROUTING;
51 	param.vdev_id = vdev_id;
52 	param.param_value = value;
53 
54 	if (wmi_set_peer_param_send(pdev_wmi_handle, peer_macaddr, &param)) {
55 		target_if_err("Unable to set default routing for peer "
56 				QDF_MAC_ADDR_STR,
57 				QDF_MAC_ADDR_ARRAY(peer_macaddr));
58 	}
59 }
60 
61 QDF_STATUS
62 target_if_peer_rx_reorder_queue_setup(struct cdp_ctrl_objmgr_pdev *pdev,
63 				      uint8_t vdev_id, uint8_t *peer_macaddr,
64 				      qdf_dma_addr_t hw_qdesc, int tid,
65 				      uint16_t queue_no,
66 				      uint8_t ba_window_size_valid,
67 				      uint16_t ba_window_size)
68 {
69 	struct rx_reorder_queue_setup_params param;
70 	struct common_wmi_handle *pdev_wmi_handle;
71 
72 	pdev_wmi_handle =
73 		lmac_get_pdev_wmi_handle((struct wlan_objmgr_pdev *)pdev);
74 	if (!pdev_wmi_handle) {
75 		target_if_err("pdev wmi handle NULL");
76 		return QDF_STATUS_E_FAILURE;
77 	}
78 	param.tid = tid;
79 	param.vdev_id = vdev_id;
80 	param.peer_macaddr = peer_macaddr;
81 	param.hw_qdesc_paddr_lo = hw_qdesc & 0xffffffff;
82 	param.hw_qdesc_paddr_hi = (uint64_t)hw_qdesc >> 32;
83 	param.queue_no = queue_no;
84 	param.ba_window_size_valid = ba_window_size_valid;
85 	param.ba_window_size = ba_window_size;
86 
87 	return wmi_unified_peer_rx_reorder_queue_setup_send(pdev_wmi_handle,
88 							    &param);
89 }
90 
91 QDF_STATUS
92 target_if_peer_rx_reorder_queue_remove(struct cdp_ctrl_objmgr_pdev *pdev,
93 				       uint8_t vdev_id, uint8_t *peer_macaddr,
94 				       uint32_t peer_tid_bitmap)
95 {
96 	struct rx_reorder_queue_remove_params param;
97 	struct common_wmi_handle *pdev_wmi_handle;
98 
99 	pdev_wmi_handle =
100 		lmac_get_pdev_wmi_handle((struct wlan_objmgr_pdev *)pdev);
101 	if (!pdev_wmi_handle) {
102 		target_if_err("pdev wmi handle NULL");
103 		return QDF_STATUS_E_FAILURE;
104 	}
105 	param.vdev_id = vdev_id;
106 	param.peer_macaddr = peer_macaddr;
107 	param.peer_tid_bitmap = peer_tid_bitmap;
108 	return wmi_unified_peer_rx_reorder_queue_remove_send(pdev_wmi_handle,
109 							     &param);
110 }
111 
112 QDF_STATUS
113 target_if_lro_hash_config(struct cdp_ctrl_objmgr_pdev *pdev,
114 			  struct cdp_lro_hash_config *lro_hash_cfg)
115 {
116 	struct wmi_lro_config_cmd_t wmi_lro_cmd = {0};
117 	struct common_wmi_handle *pdev_wmi_handle;
118 
119 	pdev_wmi_handle =
120 		lmac_get_pdev_wmi_handle((struct wlan_objmgr_pdev *)pdev);
121 	if (!lro_hash_cfg || !pdev_wmi_handle) {
122 		target_if_err("wmi_handle: 0x%pK, lro_hash_cfg: 0x%pK",
123 			      pdev_wmi_handle, lro_hash_cfg);
124 		return QDF_STATUS_E_FAILURE;
125 	}
126 
127 	wmi_lro_cmd.lro_enable = lro_hash_cfg->lro_enable;
128 	wmi_lro_cmd.tcp_flag = lro_hash_cfg->tcp_flag;
129 	wmi_lro_cmd.tcp_flag_mask = lro_hash_cfg->tcp_flag_mask;
130 	wmi_lro_cmd.pdev_id =
131 		lmac_get_pdev_idx((struct wlan_objmgr_pdev *)pdev);
132 
133 	qdf_mem_copy(wmi_lro_cmd.toeplitz_hash_ipv4,
134 		     lro_hash_cfg->toeplitz_hash_ipv4,
135 		     LRO_IPV4_SEED_ARR_SZ * sizeof(uint32_t));
136 
137 	qdf_mem_copy(wmi_lro_cmd.toeplitz_hash_ipv6,
138 		     lro_hash_cfg->toeplitz_hash_ipv6,
139 		     LRO_IPV6_SEED_ARR_SZ * sizeof(uint32_t));
140 
141 	return wmi_unified_lro_config_cmd(pdev_wmi_handle,
142 					  &wmi_lro_cmd);
143 }
144