1 /*- 2 * Copyright 2016-2023 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 27 #ifndef _PQI_PROTOTYPES_H 28 #define _PQI_PROTOTYPES_H 29 30 /* Function prototypes */ 31 32 /*smartpqi_init.c */ 33 int pqisrc_init(pqisrc_softstate_t *); 34 void pqisrc_uninit(pqisrc_softstate_t *); 35 void pqisrc_pqi_uninit(pqisrc_softstate_t *); 36 int pqisrc_process_config_table(pqisrc_softstate_t *); 37 int pqisrc_flush_cache(pqisrc_softstate_t *, enum pqisrc_flush_cache_event_type); 38 int pqisrc_wait_for_pqi_reset_completion(pqisrc_softstate_t *); 39 int pqisrc_wait_for_cmnd_complete(pqisrc_softstate_t *); 40 void pqisrc_complete_internal_cmds(pqisrc_softstate_t *); 41 void sanity_check_os_behavior(pqisrc_softstate_t *); 42 43 44 /* smartpqi_sis.c*/ 45 int pqisrc_sis_init(pqisrc_softstate_t *); 46 void pqisrc_sis_uninit(pqisrc_softstate_t *); 47 int pqisrc_reenable_sis(pqisrc_softstate_t *); 48 void pqisrc_trigger_nmi_sis(pqisrc_softstate_t *); 49 void sis_disable_msix(pqisrc_softstate_t *); 50 void sis_enable_intx(pqisrc_softstate_t *); 51 void sis_disable_intx(pqisrc_softstate_t *softs); 52 int pqisrc_force_sis(pqisrc_softstate_t *); 53 int pqisrc_sis_wait_for_db_bit_to_clear(pqisrc_softstate_t *, uint32_t); 54 void sis_disable_interrupt(pqisrc_softstate_t*); 55 56 57 /* smartpqi_queue.c */ 58 int pqisrc_submit_admin_req(pqisrc_softstate_t *, 59 gen_adm_req_iu_t *, gen_adm_resp_iu_t *); 60 int pqisrc_create_admin_queue(pqisrc_softstate_t *); 61 int pqisrc_destroy_admin_queue(pqisrc_softstate_t *); 62 int pqisrc_create_op_queues(pqisrc_softstate_t *); 63 int pqisrc_allocate_and_init_inbound_q(pqisrc_softstate_t *, ib_queue_t *, 64 char *); 65 int pqisrc_allocate_and_init_outbound_q(pqisrc_softstate_t *, ob_queue_t *, 66 char *); 67 68 /* smartpqi_cmd.c */ 69 int pqisrc_submit_cmnd(pqisrc_softstate_t *,ib_queue_t *,void *); 70 71 /* smartpqi_tag.c */ 72 #ifndef LOCKFREE_STACK 73 int pqisrc_init_taglist(pqisrc_softstate_t *,pqi_taglist_t *,uint32_t); 74 void pqisrc_destroy_taglist(pqisrc_softstate_t *,pqi_taglist_t *); 75 void pqisrc_put_tag(pqi_taglist_t *,uint32_t); 76 uint32_t pqisrc_get_tag(pqi_taglist_t *); 77 #else 78 int pqisrc_init_taglist(pqisrc_softstate_t *, lockless_stack_t *, uint32_t); 79 void pqisrc_destroy_taglist(pqisrc_softstate_t *, lockless_stack_t *); 80 void pqisrc_put_tag(lockless_stack_t *,uint32_t); 81 uint32_t pqisrc_get_tag(lockless_stack_t *); 82 #endif /* LOCKFREE_STACK */ 83 84 /* smartpqi_discovery.c */ 85 void pqisrc_remove_device(pqisrc_softstate_t *, pqi_scsi_dev_t *); 86 boolean_t pqisrc_add_softs_entry(pqisrc_softstate_t *softs, pqi_scsi_dev_t *device, 87 uint8_t *scsi3addr); 88 int pqisrc_get_ctrl_fw_version(pqisrc_softstate_t *); 89 int pqisrc_rescan_devices(pqisrc_softstate_t *); 90 int pqisrc_scan_devices(pqisrc_softstate_t *); 91 void pqisrc_cleanup_devices(pqisrc_softstate_t *); 92 void pqisrc_device_mem_free(pqisrc_softstate_t *, pqi_scsi_dev_t *); 93 boolean_t pqisrc_is_external_raid_device(pqi_scsi_dev_t *device); 94 void pqisrc_free_device(pqisrc_softstate_t * softs,pqi_scsi_dev_t *device); 95 void pqisrc_init_bitmap(pqisrc_softstate_t *softs); 96 void pqisrc_remove_target_bit(pqisrc_softstate_t *softs, int target); 97 int pqisrc_find_avail_target(pqisrc_softstate_t *softs); 98 int pqisrc_find_device_list_index(pqisrc_softstate_t *softs, 99 pqi_scsi_dev_t *device); 100 int pqisrc_find_btl_list_index(pqisrc_softstate_t *softs, 101 int bus, int target, int lun); 102 int pqisrc_delete_softs_entry(pqisrc_softstate_t *softs, 103 pqi_scsi_dev_t *device); 104 int pqisrc_get_physical_logical_luns(pqisrc_softstate_t *softs, uint8_t cmd, 105 reportlun_data_ext_t **buff, size_t *data_length); 106 int pqisrc_send_scsi_inquiry(pqisrc_softstate_t *softs, 107 uint8_t *scsi3addr, uint16_t vpd_page, uint8_t *buff, int buf_len); 108 int pqisrc_simple_dma_alloc(pqisrc_softstate_t *, struct dma_mem *, size_t, 109 sgt_t *); 110 int pqisrc_prepare_send_raid(pqisrc_softstate_t *, pqisrc_raid_req_t *, 111 void *, size_t , uint8_t *, raid_path_error_info_elem_t *); 112 113 114 /* smartpqi_helper.c */ 115 boolean_t pqisrc_ctrl_offline(pqisrc_softstate_t *); 116 void pqisrc_heartbeat_timer_handler(pqisrc_softstate_t *); 117 int pqisrc_wait_on_condition(pqisrc_softstate_t *softs, rcb_t *rcb, 118 uint32_t timeout); 119 boolean_t pqisrc_device_equal(pqi_scsi_dev_t *, pqi_scsi_dev_t *); 120 boolean_t pqisrc_is_hba_lunid(uint8_t *); 121 boolean_t pqisrc_is_logical_device(pqi_scsi_dev_t *); 122 void pqisrc_sanitize_inquiry_string(unsigned char *, int ); 123 void pqisrc_display_device_info(pqisrc_softstate_t *, char *, pqi_scsi_dev_t *); 124 boolean_t pqisrc_scsi3addr_equal(uint8_t *, uint8_t *); 125 void check_struct_sizes(void); 126 char *pqisrc_raidlevel_to_string(uint8_t); 127 void pqisrc_configure_legacy_intx(pqisrc_softstate_t*, boolean_t); 128 void pqisrc_ctrl_diagnostic_options(pqisrc_softstate_t *); 129 void pqisrc_wait_for_device_commands_to_complete(pqisrc_softstate_t *, 130 pqi_scsi_dev_t *); 131 int pqisrc_QuerySenseFeatures(pqisrc_softstate_t *); 132 void check_device_pending_commands_to_complete(pqisrc_softstate_t *, 133 pqi_scsi_dev_t *); 134 uint32_t pqisrc_count_num_scsi_active_requests_on_dev(pqisrc_softstate_t *, 135 pqi_scsi_dev_t *); 136 137 /* smartpqi_response.c */ 138 void pqisrc_process_internal_raid_response_success(pqisrc_softstate_t *, 139 rcb_t *); 140 void pqisrc_process_internal_raid_response_error(pqisrc_softstate_t *, 141 rcb_t *, uint16_t); 142 void pqisrc_process_io_response_success(pqisrc_softstate_t *, 143 rcb_t *); 144 void pqisrc_show_sense_data_full(pqisrc_softstate_t *, rcb_t *, sense_data_u_t *sense_data); 145 void pqisrc_process_aio_response_error(pqisrc_softstate_t *, 146 rcb_t *, uint16_t); 147 void pqisrc_process_raid_response_error(pqisrc_softstate_t *, 148 rcb_t *, uint16_t); 149 void pqisrc_process_response_queue(pqisrc_softstate_t *, int); 150 void pqisrc_show_aio_error_info(pqisrc_softstate_t *softs, rcb_t *rcb, 151 aio_path_error_info_elem_t *aio_err); 152 void pqisrc_show_raid_error_info(pqisrc_softstate_t *softs, rcb_t *rcb, 153 raid_path_error_info_elem_t *aio_err); 154 boolean_t suppress_innocuous_error_prints(pqisrc_softstate_t *softs, 155 rcb_t *rcb); 156 uint8_t pqisrc_get_cmd_from_rcb(rcb_t *); 157 boolean_t pqisrc_is_innocuous_error(pqisrc_softstate_t *, rcb_t *, void *); 158 159 160 /* smartpqi_request.c */ 161 int pqisrc_build_send_vendor_request(pqisrc_softstate_t *softs, 162 struct pqi_vendor_general_request *request); 163 int pqisrc_build_send_io(pqisrc_softstate_t *,rcb_t *); 164 int pqisrc_build_scsi_cmd_raidbypass(pqisrc_softstate_t *softs, 165 pqi_scsi_dev_t *device, rcb_t *rcb); 166 int pqisrc_send_tmf(pqisrc_softstate_t *, pqi_scsi_dev_t *, 167 rcb_t *, rcb_t *, int); 168 int pqisrc_write_current_time_to_host_wellness(pqisrc_softstate_t *softs); 169 int pqisrc_write_driver_version_to_host_wellness(pqisrc_softstate_t *softs); 170 void pqisrc_build_aio_common(pqisrc_softstate_t *, pqi_aio_req_t *, 171 rcb_t *, uint32_t); 172 void pqisrc_build_aio_R1_write(pqisrc_softstate_t *, 173 pqi_aio_raid1_write_req_t *, rcb_t *, uint32_t); 174 void pqisrc_build_aio_R5or6_write(pqisrc_softstate_t *, 175 pqi_aio_raid5or6_write_req_t *, rcb_t *, uint32_t); 176 void pqisrc_show_cdb(pqisrc_softstate_t *softs, char *msg, rcb_t *rcb, uint8_t *cdb); 177 void pqisrc_print_buffer(pqisrc_softstate_t *softs, char *msg, void *user_buf, uint32_t total_len, uint32_t flags); 178 void pqisrc_show_rcb_details(pqisrc_softstate_t *softs, rcb_t *rcb, char *msg, void *err_info); 179 void pqisrc_show_aio_io(pqisrc_softstate_t *, rcb_t *, 180 pqi_aio_req_t *, uint32_t); 181 void pqisrc_show_aio_common(pqisrc_softstate_t *, rcb_t *, pqi_aio_req_t *); 182 void pqisrc_show_aio_R1_write(pqisrc_softstate_t *, rcb_t *, 183 pqi_aio_raid1_write_req_t *); 184 void pqisrc_show_aio_R5or6_write(pqisrc_softstate_t *, rcb_t *, 185 pqi_aio_raid5or6_write_req_t *); 186 boolean_t pqisrc_cdb_is_write(uint8_t *); 187 void print_this_counter(pqisrc_softstate_t *softs, io_counters_t *pcounter, char *msg); 188 void print_all_counters(pqisrc_softstate_t *softs, uint32_t flags); 189 char *io_path_to_ascii(IO_PATH_T path); 190 void int_to_scsilun(uint64_t, uint8_t *); 191 boolean_t pqisrc_cdb_is_read(uint8_t *); 192 void pqisrc_build_aio_io(pqisrc_softstate_t *, rcb_t *, pqi_aio_req_t *, uint32_t); 193 uint8_t pqisrc_get_aio_data_direction(rcb_t *); 194 uint8_t pqisrc_get_raid_data_direction(rcb_t *); 195 void dump_tmf_details(pqisrc_softstate_t *, rcb_t *, char *); 196 io_type_t get_io_type_from_cdb(uint8_t *); 197 OS_ATOMIC64_T increment_this_counter(io_counters_t *, IO_PATH_T , io_type_t ); 198 boolean_t 199 is_buffer_zero(void *, uint32_t ); 200 201 202 203 204 /* smartpqi_event.c*/ 205 int pqisrc_report_event_config(pqisrc_softstate_t *); 206 int pqisrc_set_event_config(pqisrc_softstate_t *); 207 int pqisrc_process_event_intr_src(pqisrc_softstate_t *,int); 208 void pqisrc_ack_all_events(void *arg); 209 void pqisrc_wait_for_rescan_complete(pqisrc_softstate_t *softs); 210 211 int pqisrc_prepare_send_ctrlr_request(pqisrc_softstate_t *softs, pqisrc_raid_req_t *request, 212 void *buff, size_t datasize); 213 214 int pqisrc_submit_management_req(pqisrc_softstate_t *, 215 pqi_event_config_request_t *); 216 void pqisrc_take_devices_offline(pqisrc_softstate_t *); 217 void pqisrc_take_ctrl_offline(pqisrc_softstate_t *); 218 void pqisrc_free_rcb(pqisrc_softstate_t *, int); 219 void pqisrc_decide_opq_config(pqisrc_softstate_t *); 220 int pqisrc_configure_op_queues(pqisrc_softstate_t *); 221 int pqisrc_pqi_init(pqisrc_softstate_t *); 222 int pqi_reset(pqisrc_softstate_t *); 223 int pqisrc_check_pqimode(pqisrc_softstate_t *); 224 int pqisrc_check_fw_status(pqisrc_softstate_t *); 225 int pqisrc_init_struct_base(pqisrc_softstate_t *); 226 int pqisrc_get_sis_pqi_cap(pqisrc_softstate_t *); 227 int pqisrc_get_preferred_settings(pqisrc_softstate_t *); 228 int pqisrc_get_adapter_properties(pqisrc_softstate_t *, 229 uint32_t *, uint32_t *); 230 231 void pqisrc_get_admin_queue_config(pqisrc_softstate_t *); 232 void pqisrc_decide_admin_queue_config(pqisrc_softstate_t *); 233 int pqisrc_allocate_and_init_adminq(pqisrc_softstate_t *); 234 int pqisrc_create_delete_adminq(pqisrc_softstate_t *, uint32_t); 235 void pqisrc_print_adminq_config(pqisrc_softstate_t *); 236 int pqisrc_delete_op_queue(pqisrc_softstate_t *, uint32_t, boolean_t); 237 void pqisrc_destroy_event_queue(pqisrc_softstate_t *); 238 void pqisrc_destroy_op_ib_queues(pqisrc_softstate_t *); 239 void pqisrc_destroy_op_ob_queues(pqisrc_softstate_t *); 240 int pqisrc_change_op_ibq_queue_prop(pqisrc_softstate_t *, ib_queue_t *, 241 uint32_t); 242 int pqisrc_create_op_obq(pqisrc_softstate_t *, ob_queue_t *); 243 int pqisrc_create_op_ibq(pqisrc_softstate_t *, ib_queue_t *); 244 int pqisrc_create_op_aio_ibq(pqisrc_softstate_t *, ib_queue_t *); 245 int pqisrc_create_op_raid_ibq(pqisrc_softstate_t *, ib_queue_t *); 246 int pqisrc_alloc_and_create_event_queue(pqisrc_softstate_t *); 247 int pqisrc_alloc_and_create_ib_queues(pqisrc_softstate_t *); 248 int pqisrc_alloc_and_create_ib_queues(pqisrc_softstate_t *); 249 int pqisrc_alloc_and_create_ob_queues(pqisrc_softstate_t *); 250 int pqisrc_process_task_management_response(pqisrc_softstate_t *, 251 pqi_tmf_resp_t *); 252 253 /* smartpqi_ioctl.c*/ 254 int pqisrc_passthru_ioctl(struct pqisrc_softstate *, void *, int); 255 256 /* Functions Prototypes */ 257 /* smartpqi_mem.c */ 258 int os_dma_mem_alloc(pqisrc_softstate_t *,struct dma_mem *); 259 void os_dma_mem_free(pqisrc_softstate_t *,struct dma_mem *); 260 void *os_mem_alloc(pqisrc_softstate_t *,size_t); 261 void os_mem_free(pqisrc_softstate_t *,void *,size_t); 262 void os_resource_free(pqisrc_softstate_t *); 263 int os_dma_setup(pqisrc_softstate_t *); 264 int os_dma_destroy(pqisrc_softstate_t *); 265 void os_update_dma_attributes(pqisrc_softstate_t *); 266 267 /* smartpqi_intr.c */ 268 int os_get_intr_config(pqisrc_softstate_t *); 269 int os_setup_intr(pqisrc_softstate_t *); 270 int os_destroy_intr(pqisrc_softstate_t *); 271 int os_get_processor_config(pqisrc_softstate_t *); 272 void os_free_intr_config(pqisrc_softstate_t *); 273 274 /* smartpqi_ioctl.c */ 275 int os_copy_to_user(struct pqisrc_softstate *, void *, 276 void *, int, int); 277 int os_copy_from_user(struct pqisrc_softstate *, void *, 278 void *, int, int); 279 int create_char_dev(struct pqisrc_softstate *, int); 280 void destroy_char_dev(struct pqisrc_softstate *); 281 282 /* smartpqi_misc.c*/ 283 int os_init_spinlock(struct pqisrc_softstate *, struct mtx *, char *); 284 void os_uninit_spinlock(struct mtx *); 285 int os_create_semaphore(const char *, int,struct sema *); 286 int os_destroy_semaphore(struct sema *); 287 void os_sema_lock(struct sema *); 288 void os_sema_unlock(struct sema *); 289 void bsd_set_hint_adapter_cap(struct pqisrc_softstate *); 290 void bsd_set_hint_adapter_cpu_config(struct pqisrc_softstate *); 291 292 int os_strlcpy(char *dst, char *src, int len); 293 void os_complete_outstanding_cmds_nodevice(pqisrc_softstate_t *); 294 void os_stop_heartbeat_timer(pqisrc_softstate_t *); 295 void os_start_heartbeat_timer(void *); 296 297 /* smartpqi_cam.c */ 298 uint8_t os_get_task_attr(rcb_t *); 299 void smartpqi_target_rescan(struct pqisrc_softstate *); 300 void os_rescan_target(struct pqisrc_softstate *, pqi_scsi_dev_t *); 301 302 /* smartpqi_intr.c smartpqi_main.c */ 303 void pqisrc_event_worker(void *, int); 304 void os_add_device(pqisrc_softstate_t *, pqi_scsi_dev_t *); 305 void os_remove_device(pqisrc_softstate_t *, pqi_scsi_dev_t *); 306 void os_io_response_success(rcb_t *); 307 void os_aio_response_error(rcb_t *, aio_path_error_info_elem_t *); 308 boolean_t check_device_hint_status(struct pqisrc_softstate *, unsigned int ); 309 void smartpqi_adjust_queue_depth(struct cam_path *, uint32_t ); 310 void os_raid_response_error(rcb_t *, raid_path_error_info_elem_t *); 311 void os_wellness_periodic(void *); 312 void os_reset_rcb( rcb_t *); 313 int register_sim(struct pqisrc_softstate *, int); 314 void deregister_sim(struct pqisrc_softstate *); 315 int check_for_scsi_opcode(uint8_t *, boolean_t *, uint64_t *, 316 uint32_t *); 317 int register_legacy_intr(pqisrc_softstate_t *); 318 int register_msix_intr(pqisrc_softstate_t *); 319 void deregister_pqi_intx(pqisrc_softstate_t *); 320 void deregister_pqi_msix(pqisrc_softstate_t *); 321 void os_get_time(struct bmic_host_wellness_time *); 322 void os_eventtaskqueue_enqueue(pqisrc_softstate_t *); 323 void pqisrc_save_controller_info(struct pqisrc_softstate *); 324 325 /* Domain status conversion */ 326 int bsd_status_to_pqi_status(int ); 327 #endif 328