1 /*- 2 * Copyright 2016-2021 Microchip Technology, Inc. and/or its subsidiaries. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26 /* $FreeBSD$ */ 27 28 #ifndef _PQI_PROTOTYPES_H 29 #define _PQI_PROTOTYPES_H 30 31 /* Function prototypes */ 32 33 /*pqi_init.c */ 34 int pqisrc_init(pqisrc_softstate_t *); 35 void pqisrc_uninit(pqisrc_softstate_t *); 36 void pqisrc_pqi_uninit(pqisrc_softstate_t *); 37 int pqisrc_process_config_table(pqisrc_softstate_t *); 38 int pqisrc_flush_cache(pqisrc_softstate_t *, enum pqisrc_flush_cache_event_type); 39 int pqisrc_wait_for_pqi_reset_completion(pqisrc_softstate_t *); 40 41 /* pqi_sis.c*/ 42 int pqisrc_sis_init(pqisrc_softstate_t *); 43 void pqisrc_sis_uninit(pqisrc_softstate_t *); 44 int pqisrc_reenable_sis(pqisrc_softstate_t *); 45 void pqisrc_trigger_nmi_sis(pqisrc_softstate_t *); 46 void sis_disable_msix(pqisrc_softstate_t *); 47 void sis_enable_intx(pqisrc_softstate_t *); 48 void sis_disable_intx(pqisrc_softstate_t *softs); 49 int pqisrc_force_sis(pqisrc_softstate_t *); 50 int pqisrc_sis_wait_for_db_bit_to_clear(pqisrc_softstate_t *, uint32_t); 51 void sis_disable_interrupt(pqisrc_softstate_t*); 52 53 54 /* pqi_queue.c */ 55 int pqisrc_submit_admin_req(pqisrc_softstate_t *, 56 gen_adm_req_iu_t *, gen_adm_resp_iu_t *); 57 int pqisrc_create_admin_queue(pqisrc_softstate_t *); 58 int pqisrc_destroy_admin_queue(pqisrc_softstate_t *); 59 int pqisrc_create_op_queues(pqisrc_softstate_t *); 60 61 /* pqi_cmd.c */ 62 int pqisrc_submit_cmnd(pqisrc_softstate_t *,ib_queue_t *,void *); 63 64 /* pqi_tag.c */ 65 #ifndef LOCKFREE_STACK 66 int pqisrc_init_taglist(pqisrc_softstate_t *,pqi_taglist_t *,uint32_t); 67 void pqisrc_destroy_taglist(pqisrc_softstate_t *,pqi_taglist_t *); 68 void pqisrc_put_tag(pqi_taglist_t *,uint32_t); 69 uint32_t pqisrc_get_tag(pqi_taglist_t *); 70 #else 71 int pqisrc_init_taglist(pqisrc_softstate_t *, lockless_stack_t *, uint32_t); 72 void pqisrc_destroy_taglist(pqisrc_softstate_t *, lockless_stack_t *); 73 void pqisrc_put_tag(lockless_stack_t *,uint32_t); 74 uint32_t pqisrc_get_tag(lockless_stack_t *); 75 #endif /* LOCKFREE_STACK */ 76 77 /* pqi_discovery.c */ 78 void pqisrc_remove_device(pqisrc_softstate_t *, pqi_scsi_dev_t *); 79 int pqisrc_get_ctrl_fw_version(pqisrc_softstate_t *); 80 int pqisrc_rescan_devices(pqisrc_softstate_t *); 81 int pqisrc_scan_devices(pqisrc_softstate_t *); 82 void pqisrc_process_raid_path_io_response(pqisrc_softstate_t *, uint16_t, struct pqi_io_response *); 83 void pqisrc_process_io_error_response(pqisrc_softstate_t *, int, uint16_t, struct pqi_io_response *); 84 void pqisrc_cleanup_devices(pqisrc_softstate_t *); 85 void pqisrc_device_mem_free(pqisrc_softstate_t *, pqi_scsi_dev_t *); 86 boolean_t pqisrc_is_external_raid_device(pqi_scsi_dev_t *device); 87 void pqisrc_free_device(pqisrc_softstate_t * softs,pqi_scsi_dev_t *device); 88 void pqisrc_init_targetid_pool(pqisrc_softstate_t *softs); 89 int pqisrc_alloc_tid(pqisrc_softstate_t *softs); 90 void pqisrc_free_tid(pqisrc_softstate_t *softs, int); 91 int pqisrc_get_physical_logical_luns(pqisrc_softstate_t *softs, uint8_t cmd, 92 reportlun_data_ext_t **buff, size_t *data_length); 93 int pqisrc_send_scsi_inquiry(pqisrc_softstate_t *softs, 94 uint8_t *scsi3addr, uint16_t vpd_page, uint8_t *buff, int buf_len); 95 96 /* pqi_helper.c */ 97 boolean_t pqisrc_ctrl_offline(pqisrc_softstate_t *); 98 void pqisrc_heartbeat_timer_handler(pqisrc_softstate_t *); 99 int pqisrc_wait_on_condition(pqisrc_softstate_t *softs, rcb_t *rcb, 100 uint32_t timeout); 101 boolean_t pqisrc_device_equal(pqi_scsi_dev_t *, pqi_scsi_dev_t *); 102 boolean_t pqisrc_is_hba_lunid(uint8_t *); 103 boolean_t pqisrc_is_logical_device(pqi_scsi_dev_t *); 104 void pqisrc_sanitize_inquiry_string(unsigned char *, int ); 105 void pqisrc_display_device_info(pqisrc_softstate_t *, char *, pqi_scsi_dev_t *); 106 boolean_t pqisrc_scsi3addr_equal(uint8_t *, uint8_t *); 107 void check_struct_sizes(void); 108 char *pqisrc_raidlevel_to_string(uint8_t); 109 void pqisrc_configure_legacy_intx(pqisrc_softstate_t*, boolean_t); 110 void pqisrc_ctrl_diagnostic_options(pqisrc_softstate_t *); 111 void pqisrc_wait_for_device_commands_to_complete(pqisrc_softstate_t *, 112 pqi_scsi_dev_t *); 113 void check_device_pending_commands_to_complete(pqisrc_softstate_t *, 114 pqi_scsi_dev_t *); 115 uint32_t pqisrc_count_num_scsi_active_requests_on_dev(pqisrc_softstate_t *, 116 pqi_scsi_dev_t *); 117 118 119 /* pqi_response.c */ 120 void pqisrc_signal_event(pqisrc_softstate_t *softs, rcb_t *rcb); 121 void pqisrc_process_internal_raid_response_success(pqisrc_softstate_t *, 122 rcb_t *); 123 void pqisrc_process_internal_raid_response_error(pqisrc_softstate_t *, 124 rcb_t *, uint16_t); 125 void pqisrc_process_io_response_success(pqisrc_softstate_t *, 126 rcb_t *); 127 void pqisrc_show_sense_data_full(pqisrc_softstate_t *, rcb_t *, sense_data_u_t *sense_data); 128 void pqisrc_process_aio_response_error(pqisrc_softstate_t *, 129 rcb_t *, uint16_t); 130 void pqisrc_process_raid_response_error(pqisrc_softstate_t *, 131 rcb_t *, uint16_t); 132 void pqisrc_process_response_queue(pqisrc_softstate_t *, int); 133 134 135 136 /* pqi_request.c */ 137 int pqisrc_build_send_vendor_request(pqisrc_softstate_t*, 138 pqi_vendor_general_request_t *, 139 raid_path_error_info_elem_t *); 140 int pqisrc_build_send_io(pqisrc_softstate_t *,rcb_t *); 141 142 143 int pqisrc_send_scsi_cmd_raidbypass(pqisrc_softstate_t *softs, 144 pqi_scsi_dev_t *device, rcb_t *rcb, uint8_t*); 145 146 147 int pqisrc_send_tmf(pqisrc_softstate_t *, pqi_scsi_dev_t *, 148 rcb_t *, rcb_t *, int); 149 int pqisrc_write_current_time_to_host_wellness(pqisrc_softstate_t *softs); 150 int pqisrc_write_driver_version_to_host_wellness(pqisrc_softstate_t *softs); 151 void pqisrc_print_buffer(pqisrc_softstate_t *softs, char *msg, void *user_buf, uint32_t total_len, uint32_t flags); 152 char *io_path_to_ascii(IO_PATH_T path); 153 154 /* pqi_event.c*/ 155 int pqisrc_report_event_config(pqisrc_softstate_t *); 156 int pqisrc_set_event_config(pqisrc_softstate_t *); 157 int pqisrc_process_event_intr_src(pqisrc_softstate_t *,int); 158 void pqisrc_ack_all_events(void *arg); 159 void pqisrc_wait_for_rescan_complete(pqisrc_softstate_t *softs); 160 161 boolean_t pqisrc_update_scsi_sense(const uint8_t *, int, 162 struct sense_header_scsi *); 163 int pqisrc_build_send_raid_request(pqisrc_softstate_t *, pqisrc_raid_req_t *, 164 void *, size_t, uint8_t, uint16_t, uint8_t *, 165 raid_path_error_info_elem_t *); 166 167 int pqisrc_submit_management_req(pqisrc_softstate_t *, 168 pqi_event_config_request_t *); 169 void pqisrc_take_devices_offline(pqisrc_softstate_t *); 170 void pqisrc_take_ctrl_offline(pqisrc_softstate_t *); 171 void pqisrc_free_rcb(pqisrc_softstate_t *, int); 172 void pqisrc_decide_opq_config(pqisrc_softstate_t *); 173 int pqisrc_configure_op_queues(pqisrc_softstate_t *); 174 int pqisrc_pqi_init(pqisrc_softstate_t *); 175 int pqi_reset(pqisrc_softstate_t *); 176 int pqisrc_check_pqimode(pqisrc_softstate_t *); 177 int pqisrc_check_fw_status(pqisrc_softstate_t *); 178 int pqisrc_init_struct_base(pqisrc_softstate_t *); 179 int pqisrc_get_sis_pqi_cap(pqisrc_softstate_t *); 180 int pqisrc_get_preferred_settings(pqisrc_softstate_t *); 181 int pqisrc_get_adapter_properties(pqisrc_softstate_t *, 182 uint32_t *, uint32_t *); 183 184 void pqisrc_get_admin_queue_config(pqisrc_softstate_t *); 185 void pqisrc_decide_admin_queue_config(pqisrc_softstate_t *); 186 int pqisrc_allocate_and_init_adminq(pqisrc_softstate_t *); 187 int pqisrc_create_delete_adminq(pqisrc_softstate_t *, uint32_t); 188 void pqisrc_print_adminq_config(pqisrc_softstate_t *); 189 int pqisrc_delete_op_queue(pqisrc_softstate_t *, 190 uint32_t, boolean_t); 191 void pqisrc_destroy_event_queue(pqisrc_softstate_t *); 192 193 void pqisrc_destroy_op_ib_queues(pqisrc_softstate_t *); 194 195 void pqisrc_destroy_op_ob_queues(pqisrc_softstate_t *); 196 197 int pqisrc_change_op_ibq_queue_prop(pqisrc_softstate_t *, 198 ib_queue_t *, uint32_t); 199 int pqisrc_create_op_obq(pqisrc_softstate_t *, 200 ob_queue_t *); 201 int pqisrc_create_op_ibq(pqisrc_softstate_t *, 202 ib_queue_t *); 203 int pqisrc_create_op_aio_ibq(pqisrc_softstate_t *, ib_queue_t *); 204 int pqisrc_create_op_raid_ibq(pqisrc_softstate_t *, ib_queue_t *); 205 int pqisrc_alloc_and_create_event_queue(pqisrc_softstate_t *); 206 int pqisrc_alloc_and_create_ib_queues(pqisrc_softstate_t *); 207 int pqisrc_alloc_and_create_ob_queues(pqisrc_softstate_t *); 208 int pqisrc_process_task_management_response(pqisrc_softstate_t *, 209 pqi_tmf_resp_t *); 210 211 /*Device outstanding Io count*/ 212 uint64_t pqisrc_increment_device_active_io(pqisrc_softstate_t *, 213 pqi_scsi_dev_t *); 214 uint64_t pqisrc_decrement_device_active_io(pqisrc_softstate_t *, 215 pqi_scsi_dev_t *); 216 void pqisrc_init_device_active_io(pqisrc_softstate_t *, 217 pqi_scsi_dev_t *); 218 uint64_t pqisrc_read_device_active_io(pqisrc_softstate_t *, 219 pqi_scsi_dev_t *); 220 221 /* pqi_ioctl.c*/ 222 223 int 224 pqisrc_passthru_ioctl(struct pqisrc_softstate *, void *, int); 225 226 227 228 /* Functions Prototypes */ 229 /* FreeBSD_mem.c */ 230 int os_dma_mem_alloc(pqisrc_softstate_t *,struct dma_mem *); 231 void os_dma_mem_free(pqisrc_softstate_t *,struct dma_mem *); 232 void *os_mem_alloc(pqisrc_softstate_t *,size_t); 233 void os_mem_free(pqisrc_softstate_t *,char *,size_t); 234 void os_resource_free(pqisrc_softstate_t *); 235 int os_dma_setup(pqisrc_softstate_t *); 236 int os_dma_destroy(pqisrc_softstate_t *); 237 void os_update_dma_attributes(pqisrc_softstate_t *); 238 239 /* FreeBSD intr.c */ 240 int os_get_intr_config(pqisrc_softstate_t *); 241 int os_setup_intr(pqisrc_softstate_t *); 242 int os_destroy_intr(pqisrc_softstate_t *); 243 int os_get_processor_config(pqisrc_softstate_t *); 244 void os_free_intr_config(pqisrc_softstate_t *); 245 246 /* FreeBSD_ioctl.c */ 247 int os_copy_to_user(struct pqisrc_softstate *, void *, 248 void *, int, int); 249 int os_copy_from_user(struct pqisrc_softstate *, void *, 250 void *, int, int); 251 int create_char_dev(struct pqisrc_softstate *, int); 252 void destroy_char_dev(struct pqisrc_softstate *); 253 254 /* FreeBSD_misc.c*/ 255 int os_init_spinlock(struct pqisrc_softstate *, struct mtx *, char *); 256 void os_uninit_spinlock(struct mtx *); 257 int os_create_semaphore(const char *, int,struct sema *); 258 int os_destroy_semaphore(struct sema *); 259 void os_sema_lock(struct sema *); 260 void os_sema_unlock(struct sema *); 261 262 int os_strlcpy(char *dst, char *src, int len); 263 void os_complete_outstanding_cmds_nodevice(pqisrc_softstate_t *); 264 void os_stop_heartbeat_timer(pqisrc_softstate_t *); 265 void os_start_heartbeat_timer(void *); 266 267 /* FreeBSD_cam.c */ 268 uint8_t os_get_task_attr(rcb_t *); 269 void smartpqi_target_rescan(struct pqisrc_softstate *); 270 void os_rescan_target(struct pqisrc_softstate *, pqi_scsi_dev_t *); 271 272 /* FreeBSD_intr.c FreeBSD_main.c */ 273 void pqisrc_event_worker(void *, int); 274 void os_add_device(pqisrc_softstate_t *, pqi_scsi_dev_t *); 275 void os_remove_device(pqisrc_softstate_t *, pqi_scsi_dev_t *); 276 void os_io_response_success(rcb_t *); 277 void os_aio_response_error(rcb_t *, aio_path_error_info_elem_t *); 278 void smartpqi_adjust_queue_depth(struct cam_path *, uint32_t ); 279 void os_raid_response_error(rcb_t *, raid_path_error_info_elem_t *); 280 void os_wellness_periodic(void *); 281 void os_reset_rcb( rcb_t *); 282 int register_sim(struct pqisrc_softstate *, int); 283 void deregister_sim(struct pqisrc_softstate *); 284 int check_for_scsi_opcode(uint8_t *, boolean_t *, uint64_t *, 285 uint32_t *); 286 int register_legacy_intr(pqisrc_softstate_t *); 287 int register_msix_intr(pqisrc_softstate_t *); 288 void deregister_pqi_intx(pqisrc_softstate_t *); 289 void deregister_pqi_msix(pqisrc_softstate_t *); 290 void os_get_time(struct bmic_host_wellness_time *); 291 void os_eventtaskqueue_enqueue(pqisrc_softstate_t *); 292 void pqisrc_save_controller_info(struct pqisrc_softstate *); 293 294 /* Domain status conversion */ 295 int bsd_status_to_pqi_status(int ); 296 297 #endif // _SMARTPQI_PROTOTYPES_H 298