1 /* 2 * Copyright (c) 2017-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 * DOC: wlan_serialization_queue.c 20 * This file defines the functions which deals with the 21 * serialization queue objects. 22 */ 23 #include <wlan_objmgr_vdev_obj.h> 24 #include <wlan_objmgr_pdev_obj.h> 25 #include <wlan_objmgr_psoc_obj.h> 26 #include <qdf_list.h> 27 #include <qdf_status.h> 28 #include "wlan_serialization_api.h" 29 #include "wlan_serialization_main_i.h" 30 #include "wlan_serialization_utils_i.h" 31 #include "wlan_serialization_queue_i.h" 32 33 struct wlan_serialization_pdev_queue *wlan_serialization_get_pdev_queue_obj( 34 struct wlan_ser_pdev_obj *pdev_obj, 35 enum wlan_serialization_cmd_type cmd_type) 36 { 37 struct wlan_serialization_pdev_queue *pdev_queue = NULL; 38 39 if (cmd_type < WLAN_SER_CMD_NONSCAN) 40 pdev_queue = &pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_SCAN]; 41 else 42 pdev_queue = &pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN]; 43 44 return pdev_queue; 45 } 46 47 struct wlan_serialization_vdev_queue *wlan_serialization_get_vdev_queue_obj( 48 struct wlan_ser_vdev_obj *vdev_obj, 49 enum wlan_serialization_cmd_type cmd_type) 50 { 51 struct wlan_serialization_vdev_queue *vdev_queue = NULL; 52 53 vdev_queue = &vdev_obj->vdev_q[SER_VDEV_QUEUE_COMP_NON_SCAN]; 54 55 return vdev_queue; 56 } 57 58 qdf_list_t *wlan_serialization_get_list_from_pdev_queue( 59 struct wlan_ser_pdev_obj *pdev_obj, 60 enum wlan_serialization_cmd_type cmd_type, 61 uint8_t is_active_cmd) 62 { 63 struct wlan_serialization_pdev_queue *pdev_queue; 64 qdf_list_t *queue = NULL; 65 66 pdev_queue = wlan_serialization_get_pdev_queue_obj(pdev_obj, cmd_type); 67 if (is_active_cmd) 68 queue = &pdev_queue->active_list; 69 else 70 queue = &pdev_queue->pending_list; 71 72 return queue; 73 } 74 75 qdf_list_t *wlan_serialization_get_list_from_vdev_queue( 76 struct wlan_ser_vdev_obj *vdev_obj, 77 enum wlan_serialization_cmd_type cmd_type, 78 uint8_t is_active_cmd) 79 { 80 struct wlan_serialization_vdev_queue *vdev_queue; 81 qdf_list_t *queue = NULL; 82 83 vdev_queue = wlan_serialization_get_vdev_queue_obj(vdev_obj, cmd_type); 84 if (is_active_cmd) 85 queue = &vdev_queue->active_list; 86 else 87 queue = &vdev_queue->pending_list; 88 89 return queue; 90 } 91 92 enum wlan_serialization_status 93 wlan_serialization_add_cmd_to_pdev_queue( 94 struct wlan_ser_pdev_obj *pdev_obj, 95 struct wlan_serialization_command_list *cmd_list, 96 uint8_t for_active_queue) 97 { 98 qdf_list_t *queue; 99 enum wlan_serialization_status status = WLAN_SER_CMD_DENIED_UNSPECIFIED; 100 101 if (!pdev_obj) { 102 ser_err("invalid serialization pdev"); 103 status = WLAN_SER_CMD_DENIED_UNSPECIFIED; 104 goto error; 105 } 106 107 queue = wlan_serialization_get_list_from_pdev_queue( 108 pdev_obj, cmd_list->cmd.cmd_type, for_active_queue); 109 110 status = wlan_serialization_add_cmd_to_queue(queue, cmd_list, 111 pdev_obj, 112 for_active_queue, 113 WLAN_SER_PDEV_NODE); 114 115 error: 116 return status; 117 } 118 119 enum wlan_serialization_status 120 wlan_serialization_add_cmd_to_vdev_queue( 121 struct wlan_ser_pdev_obj *pdev_obj, 122 struct wlan_serialization_command_list *cmd_list, 123 uint8_t for_active_queue) 124 { 125 qdf_list_t *queue; 126 enum wlan_serialization_status status; 127 struct wlan_serialization_command *cmd; 128 struct wlan_ser_vdev_obj *vdev_obj; 129 130 cmd = &cmd_list->cmd; 131 132 vdev_obj = wlan_serialization_get_vdev_obj( 133 wlan_serialization_get_vdev_from_cmd(cmd)); 134 135 queue = wlan_serialization_get_list_from_vdev_queue(vdev_obj, 136 cmd->cmd_type, 137 for_active_queue); 138 139 status = wlan_serialization_add_cmd_to_queue(queue, cmd_list, 140 pdev_obj, 141 for_active_queue, 142 WLAN_SER_VDEV_NODE); 143 144 return status; 145 } 146 147 QDF_STATUS 148 wlan_serialization_remove_cmd_from_pdev_queue( 149 struct wlan_ser_pdev_obj *pdev_obj, 150 struct wlan_serialization_command_list **pcmd_list, 151 struct wlan_serialization_command *cmd, 152 uint8_t is_active_queue) 153 { 154 qdf_list_t *queue; 155 QDF_STATUS status = QDF_STATUS_E_FAILURE; 156 157 if (!pdev_obj) { 158 ser_err("Invalid pdev"); 159 return status; 160 } 161 162 queue = wlan_serialization_get_list_from_pdev_queue( 163 pdev_obj, cmd->cmd_type, is_active_queue); 164 165 status = wlan_serialization_remove_cmd_from_queue(queue, cmd, 166 pcmd_list, 167 pdev_obj, 168 WLAN_SER_PDEV_NODE); 169 170 return status; 171 } 172 173 QDF_STATUS 174 wlan_serialization_remove_cmd_from_vdev_queue( 175 struct wlan_ser_pdev_obj *pdev_obj, 176 struct wlan_serialization_command_list **pcmd_list, 177 struct wlan_serialization_command *cmd, 178 uint8_t is_active_queue) 179 { 180 qdf_list_t *queue; 181 QDF_STATUS status = QDF_STATUS_E_FAILURE; 182 struct wlan_ser_vdev_obj *vdev_obj; 183 184 vdev_obj = wlan_serialization_get_vdev_obj( 185 wlan_serialization_get_vdev_from_cmd(cmd)); 186 187 queue = wlan_serialization_get_list_from_vdev_queue(vdev_obj, 188 cmd->cmd_type, 189 is_active_queue); 190 191 status = wlan_serialization_remove_cmd_from_queue(queue, cmd, 192 pcmd_list, 193 pdev_obj, 194 WLAN_SER_VDEV_NODE); 195 196 return status; 197 } 198 199