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