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