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 #include <qdf_status.h> 20 #include <target_if_direct_buf_rx_api.h> 21 #include <wlan_objmgr_cmn.h> 22 #include <wlan_objmgr_global_obj.h> 23 #include <wlan_objmgr_psoc_obj.h> 24 #include <wlan_objmgr_cmn.h> 25 #include "target_if_direct_buf_rx_main.h" 26 27 QDF_STATUS direct_buf_rx_init(void) 28 { 29 QDF_STATUS status; 30 31 status = wlan_objmgr_register_psoc_create_handler( 32 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 33 target_if_direct_buf_rx_psoc_create_handler, 34 NULL); 35 36 if (QDF_IS_STATUS_ERROR(status)) { 37 direct_buf_rx_err("Failed to register psoc create handler"); 38 return status; 39 } 40 41 status = wlan_objmgr_register_psoc_destroy_handler( 42 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 43 target_if_direct_buf_rx_psoc_destroy_handler, 44 NULL); 45 46 if (QDF_IS_STATUS_ERROR(status)) { 47 direct_buf_rx_err("Failed to register psoc destroy handler"); 48 goto dbr_unreg_psoc_create; 49 } 50 51 status = wlan_objmgr_register_pdev_create_handler( 52 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 53 target_if_direct_buf_rx_pdev_create_handler, 54 NULL); 55 56 if (QDF_IS_STATUS_ERROR(status)) { 57 direct_buf_rx_err("Failed to register pdev create handler"); 58 goto dbr_unreg_psoc_destroy; 59 } 60 61 status = wlan_objmgr_register_pdev_destroy_handler( 62 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 63 target_if_direct_buf_rx_pdev_destroy_handler, 64 NULL); 65 66 if (QDF_IS_STATUS_ERROR(status)) { 67 direct_buf_rx_err("Failed to register pdev destroy handler"); 68 goto dbr_unreg_pdev_create; 69 } 70 71 direct_buf_rx_info("Direct Buffer RX pdev,psoc create and destroy handlers registered"); 72 73 return QDF_STATUS_SUCCESS; 74 75 dbr_unreg_pdev_create: 76 status = wlan_objmgr_unregister_pdev_create_handler( 77 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 78 target_if_direct_buf_rx_pdev_create_handler, 79 NULL); 80 81 dbr_unreg_psoc_destroy: 82 status = wlan_objmgr_unregister_psoc_destroy_handler( 83 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 84 target_if_direct_buf_rx_psoc_destroy_handler, 85 NULL); 86 87 dbr_unreg_psoc_create: 88 status = wlan_objmgr_unregister_psoc_create_handler( 89 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 90 target_if_direct_buf_rx_psoc_create_handler, 91 NULL); 92 93 return QDF_STATUS_E_FAILURE; 94 } 95 qdf_export_symbol(direct_buf_rx_init); 96 97 QDF_STATUS direct_buf_rx_deinit(void) 98 { 99 QDF_STATUS status; 100 101 status = wlan_objmgr_unregister_pdev_destroy_handler( 102 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 103 target_if_direct_buf_rx_pdev_destroy_handler, 104 NULL); 105 106 if (QDF_IS_STATUS_ERROR(status)) 107 direct_buf_rx_err("Failed to unregister pdev destroy handler"); 108 109 status = wlan_objmgr_unregister_pdev_create_handler( 110 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 111 target_if_direct_buf_rx_pdev_create_handler, 112 NULL); 113 114 if (QDF_IS_STATUS_ERROR(status)) 115 direct_buf_rx_err("Failed to unregister pdev create handler"); 116 117 status = wlan_objmgr_unregister_psoc_destroy_handler( 118 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 119 target_if_direct_buf_rx_psoc_destroy_handler, 120 NULL); 121 122 if (QDF_IS_STATUS_ERROR(status)) 123 direct_buf_rx_err("Failed to unregister psoc destroy handler"); 124 125 status = wlan_objmgr_unregister_psoc_create_handler( 126 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX, 127 target_if_direct_buf_rx_psoc_create_handler, 128 NULL); 129 130 if (QDF_IS_STATUS_ERROR(status)) 131 direct_buf_rx_err("Failed to unregister psoc create handler"); 132 133 direct_buf_rx_info("Direct Buffer RX pdev,psoc create and destroy handlers unregistered"); 134 135 return status; 136 } 137 qdf_export_symbol(direct_buf_rx_deinit); 138 139 QDF_STATUS direct_buf_rx_target_attach(struct wlan_objmgr_psoc *psoc, 140 void *hal_soc, qdf_device_t osdev) 141 { 142 struct direct_buf_rx_psoc_obj *dbr_psoc_obj; 143 144 if (hal_soc == NULL || osdev == NULL) { 145 direct_buf_rx_err("hal soc or osdev is null"); 146 return QDF_STATUS_E_INVAL; 147 } 148 149 dbr_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 150 WLAN_TARGET_IF_COMP_DIRECT_BUF_RX); 151 152 direct_buf_rx_info("Dbr psoc obj %pK", dbr_psoc_obj); 153 154 if (dbr_psoc_obj == NULL) { 155 direct_buf_rx_err("dir buf rx psoc obj is null"); 156 return QDF_STATUS_E_FAILURE; 157 } 158 159 dbr_psoc_obj->hal_soc = hal_soc; 160 dbr_psoc_obj->osdev = osdev; 161 162 return QDF_STATUS_SUCCESS; 163 } 164 165 void target_if_direct_buf_rx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 166 { 167 tx_ops->dbr_tx_ops.direct_buf_rx_module_register = 168 target_if_direct_buf_rx_module_register; 169 tx_ops->dbr_tx_ops.direct_buf_rx_register_events = 170 target_if_direct_buf_rx_register_events; 171 tx_ops->dbr_tx_ops.direct_buf_rx_unregister_events = 172 target_if_direct_buf_rx_unregister_events; 173 } 174 qdf_export_symbol(target_if_direct_buf_rx_register_tx_ops); 175