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