1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Emulex. All rights reserved. 24 * Use is subject to License terms. 25 */ 26 27 28 #ifndef _EMLXS_EXTERN_H 29 #define _EMLXS_EXTERN_H 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 extern void *emlxs_soft_state; 36 extern uint32_t emlxs_instance[MAX_FC_BRDS]; 37 extern uint32_t emlxs_instance_count; 38 extern char emlxs_revision[32]; 39 extern char emlxs_version[32]; 40 extern char emlxs_name[64]; 41 extern char emlxs_label[64]; 42 43 extern emlxs_device_t emlxs_device; 44 extern uint32_t emlxs_instance[MAX_FC_BRDS]; 45 extern uint32_t emlxs_instance_count; 46 47 extern ddi_device_acc_attr_t emlxs_data_acc_attr; 48 extern ddi_device_acc_attr_t emlxs_dev_acc_attr; 49 extern ddi_dma_lim_t emlxs_dma_lim; 50 extern uint32_t emlxs_diag_state; 51 extern emlxs_config_t emlxs_cfg[]; 52 extern ddi_dma_attr_t emlxs_dma_attr; 53 extern ddi_dma_attr_t emlxs_dma_attr_ro; 54 extern ddi_dma_attr_t emlxs_dma_attr_fcip_rsp; 55 extern ddi_dma_attr_t emlxs_dma_attr_1sg; 56 57 /* Module emlxs_msg.c External Routine Declarations */ 58 extern void emlxs_msg_printf(emlxs_port_t *port, 59 const uint32_t fileno, 60 const uint32_t line, 61 void *bp, uint32_t size, 62 emlxs_msg_t *msg, 63 const char *fmt, ...); 64 extern uint32_t emlxs_msg_log_create(emlxs_hba_t *hba); 65 extern uint32_t emlxs_msg_log_destroy(emlxs_hba_t *hba); 66 extern uint32_t emlxs_msg_log_get(emlxs_hba_t *hba, 67 emlxs_log_req_t *req, 68 emlxs_log_resp_t *resp); 69 extern void emlxs_log_dump_event(emlxs_port_t *port, 70 uint8_t *buffer, uint32_t size); 71 extern void emlxs_log_link_event(emlxs_port_t *port); 72 extern uint32_t emlxs_log_ct_event(emlxs_port_t *port, 73 uint8_t *payload, uint32_t size, 74 uint32_t rxid); 75 extern void emlxs_log_rscn_event(emlxs_port_t *port, 76 uint8_t *payload, uint32_t size); 77 extern void emlxs_log_vportrscn_event(emlxs_port_t *port, 78 uint8_t *payload, uint32_t size); 79 extern uint32_t emlxs_get_dfc_event(emlxs_port_t *port, 80 emlxs_dfc_event_t *dfc_event, 81 uint32_t sleep); 82 extern uint32_t emlxs_kill_dfc_event(emlxs_port_t *port, 83 emlxs_dfc_event_t *dfc_event); 84 extern uint32_t emlxs_get_dfc_eventinfo(emlxs_port_t *port, 85 HBA_EVENTINFO *eventinfo, 86 uint32_t *eventcount, 87 uint32_t *missed); 88 extern void emlxs_log_temp_event(emlxs_port_t *port, 89 uint32_t type, uint32_t temp); 90 extern void emlxs_log_fcoe_event(emlxs_port_t *port, 91 menlo_init_rsp_t *init_rsp); 92 extern void emlxs_log_async_event(emlxs_port_t *port, 93 IOCB *iocb); 94 95 /* Module emlxs_solaris.c External Routine Declarations */ 96 extern int32_t emlxs_pkt_abort(opaque_t fca_port_handle, 97 fc_packet_t *pkt, int32_t sleep); 98 extern char *emlxs_state_xlate(uint8_t state); 99 extern char *emlxs_error_xlate(uint8_t errno); 100 extern void emlxs_mem_free(emlxs_hba_t *hba, 101 MBUF_INFO *buf_info); 102 extern uint8_t *emlxs_mem_alloc(emlxs_hba_t *hba, 103 MBUF_INFO *buf_info); 104 extern int emlxs_map_bus(emlxs_hba_t *hba); 105 extern void emlxs_unmap_bus(emlxs_hba_t *hba); 106 extern fc_unsol_buf_t *emlxs_ub_find(emlxs_port_t *port, 107 uint32_t token); 108 extern fc_unsol_buf_t *emlxs_ub_get(emlxs_port_t *port, uint32_t size, 109 uint32_t type, uint32_t resv); 110 extern int32_t emlxs_log_printf(int32_t f, int32_t type, 111 int32_t num, int32_t brdno, 112 const char *fmt, ...); 113 extern void emlxs_set_pkt_state(emlxs_buf_t *sbp, 114 uint32_t iostat, uint8_t localstat, 115 uint32_t lock); 116 extern char *emlxs_elscmd_xlate(uint32_t cmd); 117 extern char *emlxs_ctcmd_xlate(uint32_t cmd); 118 extern char *emlxs_rmcmd_xlate(uint32_t cmd); 119 extern char *emlxs_wwn_xlate(char *buffer, uint8_t *wwn); 120 extern int32_t emlxs_transport(opaque_t fca_port_handle, 121 fc_packet_t *pkt); 122 extern int32_t emlxs_pkt_uninit(opaque_t fca_port_handle, 123 fc_packet_t *pkt); 124 extern int32_t emlxs_pkt_init(opaque_t fca_port_handle, 125 fc_packet_t *pkt, int32_t sleep); 126 extern void emlxs_pkt_complete(emlxs_buf_t *sbp, 127 uint32_t iostat, uint8_t localstat, 128 uint32_t doneq); 129 130 #ifdef SAN_DIAG_SUPPORT 131 extern void emlxs_update_sd_bucket(emlxs_buf_t *sbp); 132 #endif /* SAN_DIAG_SUPPORT */ 133 134 extern uint32_t emlxs_get_instance(int32_t ddiinst); 135 extern char *emlxs_mscmd_xlate(uint16_t cmd); 136 extern int32_t emlxs_reset(opaque_t fca_port_handle, 137 uint32_t cmd); 138 extern void emlxs_swap_service_params(SERV_PARM *sp); 139 extern void emlxs_swap_fcp_pkt(emlxs_buf_t *sbp); 140 extern void emlxs_swap_ct_pkt(emlxs_buf_t *sbp); 141 extern void emlxs_swap_els_pkt(emlxs_buf_t *sbp); 142 extern int emlxs_ub_release(opaque_t fca_port_handle, 143 uint32_t count, uint64_t tokens[]); 144 extern void emlxs_swap_els_ub(fc_unsol_buf_t *ubp); 145 extern void emlxs_unswap_pkt(emlxs_buf_t *sbp); 146 extern uint32_t emlxs_get_key(emlxs_hba_t *hba, MAILBOX *mb); 147 extern int emlxs_pm_busy_component(dev_info_t *dip); 148 extern int emlxs_pm_idle_component(dev_info_t *dip); 149 extern void emlxs_pm_idle_timer(dev_info_t *dip); 150 extern void emlxs_shutdown_thread(emlxs_hba_t *hba, 151 void *arg1, void *arg2); 152 extern uint32_t emlxs_set_parm(emlxs_hba_t *hba, uint32_t index, 153 uint32_t new_value); 154 extern void emlxs_ub_destroy(emlxs_port_t *port, 155 emlxs_unsol_buf_t *pool); 156 extern void emlxs_ub_callback(emlxs_port_t *port, 157 fc_unsol_buf_t *ubp); 158 extern void emlxs_ub_flush(emlxs_port_t *port); 159 extern uint32_t emlxs_check_parm(emlxs_hba_t *hba, 160 uint32_t index, uint32_t new_value); 161 extern int32_t emlxs_port_manage(opaque_t fca_port_handle, 162 fc_fca_pm_t *pm); 163 extern void emlxs_port_init(emlxs_port_t *port); 164 extern void emlxs_get_fcode_version(emlxs_hba_t *hba); 165 166 #ifdef MENLO_SUPPORT 167 extern char *emlxs_menlo_cmd_xlate(uint32_t cmd); 168 extern char *emlxs_menlo_rsp_xlate(uint32_t rsp); 169 #endif /* MENLO_SUPPORT */ 170 171 #ifdef FMA_SUPPORT 172 extern void emlxs_fm_init(emlxs_hba_t *hba); 173 extern void emlxs_fm_fini(emlxs_hba_t *hba); 174 extern int emlxs_fm_check_acc_handle(emlxs_hba_t *hba, 175 ddi_acc_handle_t handle); 176 extern int emlxs_fm_check_dma_handle(emlxs_hba_t *hba, 177 ddi_dma_handle_t handle); 178 extern void emlxs_fm_ereport(emlxs_hba_t *hba, 179 char *detail); 180 extern void emlxs_fm_service_impact(emlxs_hba_t *hba, 181 int impact); 182 extern int emlxs_fm_error_cb(dev_info_t *dip, 183 ddi_fm_error_t *err, 184 const void *impl_data); 185 #endif /* FMA_SUPPORT */ 186 187 /* Module emlxs_pkt.c External Routine Declarations */ 188 extern int32_t emlxs_pkt_send(fc_packet_t *pkt, uint32_t now); 189 extern void emlxs_pkt_free(fc_packet_t *pkt); 190 extern void emlxs_pkt_callback(fc_packet_t *pkt); 191 extern fc_packet_t *emlxs_pkt_alloc(emlxs_port_t *port, 192 uint32_t cmdlen, uint32_t rsplen, 193 uint32_t datalen, int32_t sleep); 194 195 /* Module emlxs_clock.c External Routine Declarations */ 196 extern void emlxs_timer_checks(emlxs_hba_t *hba); 197 extern void emlxs_timer_start(emlxs_hba_t *hba); 198 extern void emlxs_timer_stop(emlxs_hba_t *hba); 199 extern void emlxs_link_timeout(emlxs_hba_t *hba); 200 extern clock_t emlxs_timeout(emlxs_hba_t *hba, 201 uint32_t timeout); 202 203 /* Module emlxs_dhchap.c External Routine Declarations */ 204 #ifdef DHCHAP_SUPPORT 205 extern int emlxs_dhchap_state_machine(emlxs_port_t *port, 206 RING *ring, IOCBQ *iocbq, MATCHMAP *mp, 207 NODELIST *node, int event); 208 209 extern void emlxs_dhc_attach(emlxs_hba_t *hba); 210 extern void emlxs_dhc_detach(emlxs_hba_t *hba); 211 extern void emlxs_dhc_authrsp_timeout(emlxs_port_t *port, 212 void *node, void *null); 213 extern void emlxs_dhc_reauth_timeout(emlxs_port_t *port, 214 void *newtimeout, void *node); 215 extern void emlxs_dhc_auth_stop(emlxs_port_t *port, 216 emlxs_node_t *node); 217 extern int emlxs_dhc_auth_start(emlxs_port_t *port, 218 emlxs_node_t *node, uint8_t *sbp, 219 uint8_t *ubp); 220 extern void emlxs_dhc_init_sp(emlxs_port_t *port, 221 uint32_t did, SERV_PARM *sp, 222 char **msg); 223 extern uint32_t emlxs_dhc_verify_login(emlxs_port_t *port, 224 uint32_t sid, SERV_PARM *sp); 225 extern void emlxs_dhc_status(emlxs_port_t *port, 226 emlxs_node_t *ndlp, uint32_t reason, 227 uint32_t explaination); 228 extern void emlxs_dhc_state(emlxs_port_t *port, 229 emlxs_node_t *ndlp, uint32_t state, 230 uint32_t reason, 231 uint32_t explaination); 232 extern uint32_t emlxs_dhc_init_auth(emlxs_hba_t *hba, 233 uint8_t *lwwpn, uint8_t *rwwpn); 234 extern uint32_t emlxs_dhc_get_auth_cfg(emlxs_hba_t *hba, 235 dfc_fcsp_config_t *fcsp_cfg); 236 extern uint32_t emlxs_dhc_get_auth_key(emlxs_hba_t *hba, 237 dfc_auth_password_t *dfc_auth_pwd); 238 extern uint32_t emlxs_dhc_add_auth_cfg(emlxs_hba_t *hba, 239 dfc_fcsp_config_t *fcsp_cfg, 240 dfc_password_t *dfc_pwd); 241 extern uint32_t emlxs_dhc_delete_auth_cfg(emlxs_hba_t *hba, 242 dfc_fcsp_config_t *fcsp_cfg, 243 dfc_password_t *dfc_pwd); 244 extern uint32_t emlxs_dhc_set_auth_key(emlxs_hba_t *hba, 245 dfc_auth_password_t *dfc_pwd); 246 extern uint32_t emlxs_dhc_get_auth_status(emlxs_hba_t *hba, 247 dfc_auth_status_t *fcsp_status); 248 extern uint32_t emlxs_dhc_get_auth_cfg_table(emlxs_hba_t *hba, 249 dfc_fcsp_config_t *fcsp_cfg); 250 extern uint32_t emlxs_dhc_get_auth_key_table(emlxs_hba_t *hba, 251 dfc_auth_password_t *auth_pwd); 252 #endif /* DHCHAP_SUPPORT */ 253 254 /* Module emlxs_node.c External Routine Declarations */ 255 extern void emlxs_node_timeout(emlxs_port_t *port, 256 NODELIST *ndlp, uint32_t ringno); 257 extern void emlxs_node_open(emlxs_port_t *port, 258 NODELIST *ndlp, uint32_t ringno); 259 extern void emlxs_node_close(emlxs_port_t *port, 260 NODELIST *ndlp, uint32_t ringno, 261 int32_t timeout); 262 extern NODELIST *emlxs_node_find_did(emlxs_port_t *port, 263 uint32_t did); 264 extern NODELIST *emlxs_node_find_rpi(emlxs_port_t *port, 265 uint32_t rpi); 266 extern void emlxs_node_destroy_all(emlxs_port_t *port); 267 extern NODELIST *emlxs_node_find_mac(emlxs_port_t *port, 268 uint8_t *mac); 269 extern void emlxs_node_add(emlxs_port_t *port, 270 NODELIST *ndlp); 271 extern void emlxs_node_rm(emlxs_port_t *port, 272 NODELIST *ndlp); 273 extern NODELIST *emlxs_node_find_wwpn(emlxs_port_t *port, 274 uint8_t *wwpn); 275 extern NODELIST *emlxs_node_find_index(emlxs_port_t *port, 276 uint32_t index, uint32_t nports_only); 277 extern uint32_t emlxs_nport_count(emlxs_port_t *port); 278 279 /* Module emlxs_els.c External Routine Declarations */ 280 extern int32_t emlxs_els_handle_event(emlxs_hba_t *hba, 281 RING *rp, IOCBQ *temp); 282 extern int32_t emlxs_els_handle_unsol_req(emlxs_port_t *port, 283 RING *rp, IOCBQ *iocbq, MATCHMAP *mp, 284 uint32_t size); 285 extern uint32_t emlxs_generate_rscn(emlxs_port_t *port, 286 uint32_t d_id); 287 extern int32_t emlxs_ct_handle_event(emlxs_hba_t *hba, 288 RING *rp, IOCBQ *temp); 289 extern int32_t emlxs_ct_handle_unsol_req(emlxs_port_t *port, 290 RING *rp, IOCBQ *iocbq, MATCHMAP *mp, 291 uint32_t size); 292 extern int32_t emlxs_els_reply(emlxs_port_t *port, 293 IOCBQ *iocbq, uint32_t type, 294 uint32_t type2, uint32_t reason, 295 uint32_t explain); 296 extern void emlxs_send_logo(emlxs_port_t *port, 297 uint32_t d_id); 298 extern void emlxs_reset_link_thread(emlxs_hba_t *hba, 299 void *arg1, void *arg2); 300 extern uint32_t emlxs_process_unsol_flogi(emlxs_port_t *port, 301 IOCBQ *iocbq, MATCHMAP *mp, 302 uint32_t size, char *buffer); 303 extern uint32_t emlxs_process_unsol_plogi(emlxs_port_t *port, 304 IOCBQ *iocbq, MATCHMAP *mp, 305 uint32_t size, char *buffer); 306 extern uint32_t emlxs_ub_send_login_acc(emlxs_port_t *port, 307 fc_unsol_buf_t *ubp); 308 309 #ifdef MENLO_SUPPORT 310 extern int emlxs_menlo_handle_event(emlxs_hba_t *hba, 311 RING *rp, IOCBQ *iocbq); 312 #endif /* MENLO_SUPPORT */ 313 314 /* Module emlxs_ip.c External Routine Declarations */ 315 extern int32_t emlxs_ip_handle_event(emlxs_hba_t *hba, 316 RING *rp, IOCBQ *temp); 317 extern int emlxs_ip_handle_rcv_seq_list(emlxs_hba_t *hba, 318 RING *rp, IOCBQ *saveq); 319 extern int emlxs_ip_handle_unsol_req(emlxs_port_t *port, 320 RING *rp, IOCBQ *iocbq, MATCHMAP *mp, 321 uint32_t size); 322 extern int emlxs_create_xri(emlxs_port_t *port, RING *rp, 323 NODELIST *ndlp); 324 extern int emlxs_handle_create_xri(emlxs_hba_t *hba, 325 RING *rp, IOCBQ *temp); 326 extern int emlxs_handle_xri_aborted(emlxs_hba_t *hba, 327 RING *rp, IOCBQ *temp); 328 329 /* Module emlxs_mbox.c External Routine Declarations */ 330 extern void emlxs_mb_config_msi(emlxs_hba_t *hba, 331 MAILBOX *mb, uint32_t *intr_map, 332 uint32_t intr_count); 333 extern void emlxs_mb_config_msix(emlxs_hba_t *hba, 334 MAILBOX *mb, uint32_t *intr_map, 335 uint32_t intr_count); 336 extern void emlxs_mb_read_lnk_stat(emlxs_hba_t *hba, 337 MAILBOX *mb); 338 extern void emlxs_mb_config_link(emlxs_hba_t *hba, 339 MAILBOX *mb); 340 extern void emlxs_mb_config_ring(emlxs_hba_t *hba, 341 int32_t ring, MAILBOX *mb); 342 extern void emlxs_mb_init_link(emlxs_hba_t *hba, 343 MAILBOX *mb, uint32_t topology, 344 uint32_t linkspeed); 345 extern void emlxs_mb_down_link(emlxs_hba_t *hba, 346 MAILBOX *mb); 347 extern uint32_t emlxs_mb_read_la(emlxs_hba_t *hba, 348 MAILBOX *mb); 349 extern void emlxs_mb_read_nv(emlxs_hba_t *hba, 350 MAILBOX *mb); 351 extern void emlxs_mb_read_rev(emlxs_hba_t *hba, 352 MAILBOX *mb, uint32_t v3); 353 extern uint32_t emlxs_mb_read_rpi(emlxs_hba_t *hba, 354 uint32_t rpi, MAILBOX *mb, 355 uint32_t flg); 356 extern uint32_t emlxs_mb_read_xri(emlxs_hba_t *hba, 357 uint32_t xri, MAILBOX *mb, 358 uint32_t flg); 359 extern uint32_t emlxs_mb_read_sparam(emlxs_hba_t *hba, 360 MAILBOX *mb); 361 extern uint32_t emlxs_mb_reg_did(emlxs_port_t *port, 362 uint32_t did, SERV_PARM *param, 363 emlxs_buf_t *sbp, fc_unsol_buf_t *ubp, 364 IOCBQ *iocbq); 365 extern void emlxs_disable_tc(emlxs_hba_t *hba, 366 MAILBOX *mb); 367 extern uint32_t emlxs_mb_run_biu_diag(emlxs_hba_t *hba, 368 MAILBOX *mb, uint64_t in, uint64_t out); 369 extern uint32_t emlxs_mb_unreg_rpi(emlxs_port_t *port, 370 uint32_t rpi, emlxs_buf_t *sbp, 371 fc_unsol_buf_t *ubp, IOCBQ *iocbq); 372 extern uint32_t emlxs_mb_unreg_did(emlxs_port_t *port, 373 uint32_t did, emlxs_buf_t *sbp, 374 fc_unsol_buf_t *ubp, IOCBQ *iocbq); 375 extern void emlxs_mb_dump_vpd(emlxs_hba_t *hba, 376 MAILBOX *mb, uint32_t offset); 377 extern void emlxs_mb_config_farp(emlxs_hba_t *hba, 378 MAILBOX *mb); 379 extern void emlxs_mb_read_config(emlxs_hba_t *hba, 380 MAILBOX *mb); 381 extern void emlxs_mb_put(emlxs_hba_t *hba, 382 MAILBOXQ *mbq); 383 extern MAILBOXQ *emlxs_mb_get(emlxs_hba_t *hba); 384 extern void emlxs_mb_clear_la(emlxs_hba_t *hba, 385 MAILBOX *mb); 386 extern void emlxs_mb_set_var(emlxs_hba_t *hba, 387 MAILBOX *mb, uint32_t addr, 388 uint32_t value); 389 extern void emlxs_mb_reset_ring(emlxs_hba_t *hba, 390 MAILBOX *mb, uint32_t ringno); 391 extern char *emlxs_mb_cmd_xlate(uint8_t command); 392 extern void emlxs_mb_read_status(emlxs_hba_t *hba, 393 MAILBOX *mb); 394 extern uint32_t emlxs_mb_reg_vpi(emlxs_port_t *port); 395 extern uint32_t emlxs_mb_unreg_vpi(emlxs_port_t *port); 396 extern void emlxs_mb_fini(emlxs_hba_t *hba, 397 MAILBOX *mb, uint32_t mbxStatus); 398 extern void emlxs_mb_heartbeat(emlxs_hba_t *hba, 399 MAILBOX *mb); 400 extern void emlxs_mb_async_event(emlxs_hba_t *hba, 401 MAILBOX *mb); 402 extern int32_t emlxs_mb_check_sparm(emlxs_hba_t *hba, 403 SERV_PARM *nsp); 404 extern void emlxs_mb_dump(emlxs_hba_t *hba, MAILBOX *mb, 405 uint32_t offset, uint32_t words); 406 extern void emlxs_mb_retry(emlxs_hba_t *hba, MAILBOX *mb); 407 extern void emlxs_mb_init(emlxs_hba_t *hba, MAILBOXQ *mbq, 408 uint32_t flag, uint32_t tmo); 409 410 #ifdef SLI3_SUPPORT 411 extern void emlxs_mb_config_hbq(emlxs_hba_t *hba, 412 MAILBOX *mb, int hbq_id); 413 #endif /* SLI3_SUPPORT */ 414 415 /* Module emlxs_mem.c External Routine Declarations */ 416 extern MATCHMAP *emlxs_mem_get_vaddr(emlxs_hba_t *hba, 417 RING *rp, uint64_t mapbp); 418 extern uint8_t *emlxs_mem_get(emlxs_hba_t *hba, 419 uint32_t seg); 420 extern uint8_t *emlxs_mem_put(emlxs_hba_t *hba, 421 uint32_t seg, uint8_t *bp); 422 extern int32_t emlxs_mem_free_buffer(emlxs_hba_t *hba); 423 extern int32_t emlxs_mem_alloc_buffer(emlxs_hba_t *hba); 424 extern void emlxs_mem_map_vaddr(emlxs_hba_t *hba, 425 RING *rp, MATCHMAP *mp, uint32_t *haddr, 426 uint32_t *laddr); 427 extern uint8_t *emlxs_mem_buf_alloc(emlxs_hba_t *hba); 428 extern uint8_t *emlxs_mem_buf_free(emlxs_hba_t *hba, 429 uint8_t *bp); 430 #ifdef SLI3_SUPPORT 431 extern uint32_t emlxs_hbq_alloc(emlxs_hba_t *hba, 432 uint32_t hbq_id); 433 #endif /* SLI3_SUPPORT */ 434 435 /* Module emlxs_hba.c External Routine Declarations */ 436 extern int emlxs_ffinit(emlxs_hba_t *hba); 437 extern void emlxs_decode_firmware_rev(emlxs_hba_t *hba, 438 emlxs_vpd_t *vp); 439 extern uint32_t emlxs_init_adapter_info(emlxs_hba_t *hba); 440 extern uint32_t emlxs_strtol(char *str, uint32_t base); 441 extern uint64_t emlxs_strtoll(char *str, uint32_t base); 442 extern void emlxs_decode_version(uint32_t version, 443 char *buffer); 444 extern char *emlxs_ffstate_xlate(uint32_t new_state); 445 extern char *emlxs_ring_xlate(uint32_t ringno); 446 extern void emlxs_proc_ring(emlxs_hba_t *hba, 447 RING *rp, void *arg2); 448 extern void emlxs_pcix_mxr_update(emlxs_hba_t *hba, 449 uint32_t verbose); 450 extern void emlxs_restart_thread(emlxs_hba_t *hba, 451 void *arg1, void *arg2); 452 extern void emlxs_fw_show(emlxs_hba_t *hba); 453 extern void emlxs_proc_ring_event(emlxs_hba_t *hba, 454 RING *rp, IOCBQ *iocbq); 455 456 457 #ifdef MSI_SUPPORT 458 extern int32_t emlxs_msi_add(emlxs_hba_t *hba); 459 extern int32_t emlxs_msi_remove(emlxs_hba_t *hba); 460 extern int32_t emlxs_msi_init(emlxs_hba_t *hba, uint32_t max); 461 extern int32_t emlxs_msi_uninit(emlxs_hba_t *hba); 462 #endif /* MSI_SUPPORT */ 463 464 extern int32_t emlxs_intx_add(emlxs_hba_t *hba); 465 extern int32_t emlxs_intx_remove(emlxs_hba_t *hba); 466 extern int32_t emlxs_intx_init(emlxs_hba_t *hba, uint32_t max); 467 extern int32_t emlxs_intx_uninit(emlxs_hba_t *hba); 468 469 /* Module emlxs_sli.c External Routine Declarations */ 470 extern int emlxs_sli3_map_hdw(emlxs_hba_t *hba); 471 extern int emlxs_sli4_map_hdw(emlxs_hba_t *hba); 472 473 extern void emlxs_sli3_unmap_hdw(emlxs_hba_t *hba); 474 extern void emlxs_sli4_unmap_hdw(emlxs_hba_t *hba); 475 476 extern int32_t emlxs_sli3_online(emlxs_hba_t *hba); 477 extern int32_t emlxs_sli4_online(emlxs_hba_t *hba); 478 479 extern void emlxs_sli3_offline(emlxs_hba_t *hba); 480 extern void emlxs_sli4_offline(emlxs_hba_t *hba); 481 482 extern uint32_t emlxs_sli3_hba_reset(emlxs_hba_t *hba, 483 uint32_t restart, uint32_t skip_post); 484 extern uint32_t emlxs_sli4_hba_reset(emlxs_hba_t *hba, 485 uint32_t restart, uint32_t skip_post); 486 487 extern uint32_t emlxs_sli2_bde_setup(emlxs_port_t *port, 488 emlxs_buf_t *sbp); 489 #ifdef SLI3_SUPPORT 490 extern uint32_t emlxs_sli3_bde_setup(emlxs_port_t *port, 491 emlxs_buf_t *sbp); 492 #endif 493 extern uint32_t emlxs_sli4_bde_setup(emlxs_port_t *port, 494 emlxs_buf_t *sbp); 495 496 extern uint32_t emlxs_sli2_fct_bde_setup(emlxs_port_t *port, 497 emlxs_buf_t *sbp); 498 extern uint32_t emlxs_sli3_fct_bde_setup(emlxs_port_t *port, 499 emlxs_buf_t *sbp); 500 extern uint32_t emlxs_sli4_fct_bde_setup(emlxs_port_t *port, 501 emlxs_buf_t *sbp); 502 503 extern void emlxs_sli3_issue_iocb_cmd(emlxs_hba_t *hba, 504 RING *rp, IOCBQ *iocb_cmd); 505 extern void emlxs_sli4_issue_iocb_cmd(emlxs_hba_t *hba, 506 RING *rp, IOCBQ *iocb_cmd); 507 508 extern uint32_t emlxs_sli3_issue_mbox_cmd(emlxs_hba_t *hba, 509 MAILBOX *mb, int32_t flg, uint32_t tmo); 510 extern uint32_t emlxs_sli4_issue_mbox_cmd(emlxs_hba_t *hba, 511 MAILBOX *mb, int32_t flg, uint32_t tmo); 512 513 #ifdef SFCT_SUPPORT 514 extern uint32_t emlxs_sli3_prep_fct_iocb(emlxs_port_t *port, 515 emlxs_buf_t *cmd_sbp); 516 extern uint32_t emlxs_sli4_prep_fct_iocb(emlxs_port_t *port, 517 emlxs_buf_t *cmd_sbp); 518 #endif /* SFCT_SUPPORT */ 519 520 extern uint32_t emlxs_sli3_prep_fcp_iocb(emlxs_port_t *port, 521 emlxs_buf_t *sbp); 522 extern uint32_t emlxs_sli4_prep_fcp_iocb(emlxs_port_t *port, 523 emlxs_buf_t *sbp); 524 525 extern uint32_t emlxs_sli3_prep_ip_iocb(emlxs_port_t *port, 526 emlxs_buf_t *sbp); 527 extern uint32_t emlxs_sli4_prep_ip_iocb(emlxs_port_t *port, 528 emlxs_buf_t *sbp); 529 530 extern uint32_t emlxs_sli3_prep_els_iocb(emlxs_port_t *port, 531 emlxs_buf_t *sbp); 532 extern uint32_t emlxs_sli4_prep_els_iocb(emlxs_port_t *port, 533 emlxs_buf_t *sbp); 534 535 extern uint32_t emlxs_sli3_prep_ct_iocb(emlxs_port_t *port, 536 emlxs_buf_t *sbp); 537 extern uint32_t emlxs_sli4_prep_ct_iocb(emlxs_port_t *port, 538 emlxs_buf_t *sbp); 539 540 extern void emlxs_sli3_poll_intr(emlxs_hba_t *hba, 541 uint32_t att_bit); 542 extern void emlxs_sli4_poll_intr(emlxs_hba_t *hba, 543 uint32_t att_bit); 544 extern int32_t emlxs_sli3_intx_intr(char *arg); 545 extern int32_t emlxs_sli4_intx_intr(char *arg); 546 #ifdef MSI_SUPPORT 547 extern uint32_t emlxs_sli3_msi_intr(char *arg1, char *arg2); 548 extern uint32_t emlxs_sli4_msi_intr(char *arg1, char *arg2); 549 #endif /* MSI_SUPPORT */ 550 551 552 extern uint32_t emlxs_interlock(emlxs_hba_t *hba); 553 extern uint32_t emlxs_reset_ring(emlxs_hba_t *hba, 554 uint32_t ringno); 555 extern void emlxs_handle_ff_error(emlxs_hba_t *hba); 556 extern uint32_t emlxs_handle_mb_event(emlxs_hba_t *hba); 557 extern uint32_t emlxs_mb_issue_cmd(emlxs_hba_t *hba, 558 MAILBOX *mb, int32_t flag, 559 uint32_t timeout); 560 extern void emlxs_timer_check_mbox(emlxs_hba_t *hba); 561 extern uint32_t emlxs_mb_config_port(emlxs_hba_t *hba, 562 MAILBOX *mb, uint32_t sli_mode, 563 uint32_t hbainit); 564 extern void emlxs_enable_latt(emlxs_hba_t *hba); 565 extern void emlxs_disable_intr(emlxs_hba_t *hba, 566 uint32_t att); 567 extern uint32_t emlxs_check_attention(emlxs_hba_t *hba); 568 extern uint32_t emlxs_get_attention(emlxs_hba_t *hba, 569 uint32_t msgid); 570 extern void emlxs_proc_attention(emlxs_hba_t *hba, 571 uint32_t ha_copy); 572 extern int emlxs_handle_rcv_seq(emlxs_hba_t *hba, 573 RING *rp, IOCBQ *iocbq); 574 extern void emlxs_intr_initialize(emlxs_hba_t *hba); 575 extern void emlxs_update_HBQ_index(emlxs_hba_t *hba, 576 uint32_t hbq_id); 577 extern void emlxs_hbq_free_all(emlxs_hba_t *hba, 578 uint32_t hbq_id); 579 extern uint32_t emlxs_hbq_setup(emlxs_hba_t *hba, 580 uint32_t hbq_id); 581 582 /* Module emlxs_diag.c External Routine Declarations */ 583 extern uint32_t emlxs_diag_post_run(emlxs_hba_t *hba); 584 extern uint32_t emlxs_diag_biu_run(emlxs_hba_t *hba, 585 uint32_t pattern); 586 extern uint32_t emlxs_diag_pattern[256]; 587 extern uint32_t emlxs_diag_echo_run(emlxs_port_t *port, 588 uint32_t did, uint32_t pattern); 589 extern uint32_t emlxs_core_size(emlxs_hba_t *hba); 590 extern uint32_t emlxs_core_dump(emlxs_hba_t *hba, 591 char *buffer, uint32_t size); 592 593 /* Module emlxs_download.c External Routine Declarations */ 594 extern int32_t emlxs_fw_download(emlxs_hba_t *hba, 595 caddr_t buffer, uint32_t len, 596 uint32_t offline); 597 extern uint32_t emlxs_get_max_sram(emlxs_hba_t *hba, 598 uint32_t *MaxRbusSize, 599 uint32_t *MaxIbusSize); 600 extern uint32_t emlxs_get_load_list(emlxs_hba_t *hba, 601 PROG_ID *load_list); 602 extern uint32_t emlxs_read_wakeup_parms(emlxs_hba_t *hba, 603 PWAKE_UP_PARMS WakeUpParms, 604 uint32_t verbose); 605 extern int32_t emlxs_cfl_download(emlxs_hba_t *hba, 606 uint32_t region, caddr_t buffer, 607 uint32_t len); 608 609 extern int32_t emlxs_boot_code_disable(emlxs_hba_t *hba); 610 extern int32_t emlxs_boot_code_enable(emlxs_hba_t *hba); 611 extern int32_t emlxs_boot_code_state(emlxs_hba_t *hba); 612 613 /* Module emlxs_fcp.c External Routine Declarations */ 614 extern int emlxs_power_up(emlxs_hba_t *hba); 615 extern int emlxs_power_down(emlxs_hba_t *hba); 616 extern int emlxs_reset_link(emlxs_hba_t *hba, 617 uint32_t linkup); 618 extern emlxs_buf_t *emlxs_unregister_pkt(RING *rp, 619 uint16_t iotag, uint32_t forced); 620 extern uint16_t emlxs_register_pkt(RING *rp, 621 emlxs_buf_t *sbp); 622 623 extern IOCBQ *emlxs_create_abort_xri_cn(emlxs_port_t *port, 624 NODELIST *ndlp, uint16_t iotag, 625 RING *rp, uint8_t class, int32_t flag); 626 extern IOCBQ *emlxs_create_close_xri_cn(emlxs_port_t *port, 627 NODELIST *ndlp, uint16_t iotag, 628 RING *rp); 629 extern IOCBQ *emlxs_create_abort_xri_cx(emlxs_port_t *port, 630 NODELIST *ndlp, uint16_t xid, RING *rp, 631 uint8_t class, int32_t flag); 632 extern IOCBQ *emlxs_create_close_xri_cx(emlxs_port_t *port, 633 NODELIST *ndlp, uint16_t xid, RING *rp); 634 extern void emlxs_abort_ct_exchange(emlxs_hba_t *hba, 635 emlxs_port_t *port, uint32_t rxid); 636 637 extern emlxs_buf_t *emlxs_chipq_get(RING *rp, uint16_t iotag); 638 extern void emlxs_chipq_put(RING *rp, emlxs_buf_t *sbp); 639 extern uint32_t emlxs_chipq_node_flush(emlxs_port_t *port, 640 RING *rp, NODELIST *ndlp, 641 emlxs_buf_t *fpkt); 642 extern uint32_t emlxs_chipq_lun_flush(emlxs_port_t *port, 643 NODELIST *ndlp, uint32_t lun, 644 emlxs_buf_t *fpkt); 645 extern uint32_t emlxs_chipq_node_check(emlxs_port_t *port, 646 RING *ring, NODELIST *ndlp); 647 648 extern IOCBQ *emlxs_tx_get(RING *rp, uint32_t lock); 649 extern void emlxs_tx_put(IOCBQ *iocbq, uint32_t lock); 650 extern uint32_t emlxs_tx_node_check(emlxs_port_t *port, 651 NODELIST *ndlp, RING *ring); 652 extern uint32_t emlxs_tx_node_flush(emlxs_port_t *port, 653 NODELIST *ndlp, RING *ring, 654 uint32_t shutdown, emlxs_buf_t *fpkt); 655 extern uint32_t emlxs_tx_lun_flush(emlxs_port_t *port, 656 NODELIST *ndlp, uint32_t lun, 657 emlxs_buf_t *fpkt); 658 extern uint32_t emlxs_tx_ring_flush(emlxs_hba_t *hba, 659 RING *rp, emlxs_buf_t *fpkt); 660 661 extern void emlxs_linkdown(emlxs_hba_t *hba); 662 extern void emlxs_linkup(emlxs_hba_t *hba); 663 extern void emlxs_port_online(emlxs_port_t *port); 664 extern int32_t emlxs_port_offline(emlxs_port_t *port, 665 uint32_t scope); 666 extern void emlxs_ffcleanup(emlxs_hba_t *hba); 667 extern int32_t emlxs_offline(emlxs_hba_t *hba); 668 extern int32_t emlxs_online(emlxs_hba_t *hba); 669 extern void emlxs_pcimem_bcopy(uint32_t *src, 670 uint32_t *dest, uint32_t cnt); 671 extern int32_t emlxs_post_buffer(emlxs_hba_t *hba, 672 RING *rp, int16_t cnt); 673 extern void emlxs_swap_bcopy(uint32_t *src, 674 uint32_t *dest, uint32_t cnt); 675 extern void emlxs_ff_start(emlxs_hba_t *hba); 676 extern void emlxs_handle_fcp_event(emlxs_hba_t *hba, 677 RING *rp, IOCBQ *temp); 678 extern int emlxs_fct_handle_abort(emlxs_hba_t *hba, 679 RING *rp, IOCBQ *iocbq); 680 681 /* Module emlxs_thread.c External Routine Declarations */ 682 extern void emlxs_taskq_destroy(emlxs_taskq_t *taskq); 683 extern void emlxs_taskq_create(emlxs_hba_t *hba, 684 emlxs_taskq_t *taskq); 685 extern uint32_t emlxs_taskq_dispatch(emlxs_taskq_t *taskq, 686 void (*func) (), void *arg); 687 extern void emlxs_thread_create(emlxs_hba_t *hba, 688 emlxs_thread_t *ethread); 689 extern void emlxs_thread_destroy(emlxs_thread_t *ethread); 690 extern void emlxs_thread_trigger1(emlxs_thread_t *ethread, 691 void (*func) ()); 692 extern void emlxs_thread_trigger2(emlxs_thread_t *ethread, 693 void (*func) (), RING *rp); 694 extern void emlxs_thread_spawn(emlxs_hba_t *hba, 695 void (*func) (), void *arg1, 696 void *arg2); 697 extern void emlxs_thread_spawn_create(emlxs_hba_t *hba); 698 extern void emlxs_thread_spawn_destroy(emlxs_hba_t *hba); 699 700 /* Module emlxs_dfc.c External Routine Declarations */ 701 extern int32_t emlxs_dfc_manage(emlxs_hba_t *hba, void *dfc, 702 int32_t mode); 703 extern int32_t emlxs_dfc_handle_event(emlxs_hba_t *hba, 704 RING *rp, IOCBQ *temp); 705 extern int emlxs_dfc_handle_unsol_req(emlxs_port_t *port, 706 RING *rp, IOCBQ *iocbq, MATCHMAP *mp, 707 uint32_t size); 708 extern void emlxs_fcoe_attention_thread(emlxs_hba_t *hba, 709 void *arg1, void *arg2); 710 extern uint32_t emlxs_set_hba_mode(emlxs_hba_t *hba, uint32_t mode); 711 extern uint32_t emlxs_get_dump_region(emlxs_hba_t *hba, uint32_t region, 712 uint8_t *buffer, uint32_t *psize); 713 extern int32_t emlxs_send_menlo_cmd(emlxs_hba_t *hba, uint8_t *cmd_buf, 714 uint32_t cmd_size, uint8_t *rsp_buf, 715 uint32_t *rsp_size); 716 717 #ifdef SFCT_SUPPORT 718 /* Module emlxs_fct.c External Routine Declarations */ 719 extern void emlxs_fct_link_down(emlxs_port_t *port); 720 extern void emlxs_fct_link_up(emlxs_port_t *port); 721 extern void emlxs_fct_init(emlxs_hba_t *hba); 722 extern void emlxs_fct_detach(emlxs_hba_t *hba); 723 extern int emlxs_fct_handle_unsol_els(emlxs_port_t *port, 724 RING *rp, IOCBQ *iocbq, MATCHMAP *mp, 725 uint32_t size); 726 extern int emlxs_fct_handle_unsol_req(emlxs_port_t *port, 727 RING *rp, IOCBQ *iocbq, MATCHMAP *mp, 728 uint32_t size); 729 extern int emlxs_fct_handle_fcp_event(emlxs_hba_t *hba, 730 RING *rp, IOCBQ *iocbq); 731 extern void emlxs_fct_bind_port(emlxs_port_t *port); 732 extern void emlxs_fct_unbind_port(emlxs_port_t *port); 733 extern void emlxs_fct_unsol_callback(emlxs_port_t *port, 734 fct_cmd_t *fct_cmd); 735 extern void emlxs_fct_attach(emlxs_hba_t *hba); 736 extern int emlxs_fct_port_shutdown(emlxs_port_t *port); 737 extern int emlxs_fct_port_initialize(emlxs_port_t *port); 738 739 #ifdef MODSYM_SUPPORT 740 extern void emlxs_fct_modclose(); 741 #endif /* MODSYM_SUPPORT */ 742 743 #ifdef FCT_IO_TRACE 744 extern void emlxs_fct_io_trace(emlxs_port_t *, 745 fct_cmd_t *, uint32_t); 746 #endif /* FCT_IO_TRACE */ 747 #endif /* SFCT_SUPPORT */ 748 749 #ifdef SAN_DIAG_SUPPORT 750 extern uint32_t emlxs_get_sd_event(emlxs_port_t *port, 751 emlxs_dfc_event_t *dfc_event, 752 uint32_t sleep); 753 extern void emlxs_log_sd_basic_els_event(emlxs_port_t *port, 754 uint32_t subcat, HBA_WWN *portname, 755 HBA_WWN *nodename); 756 extern void emlxs_log_sd_prlo_event(emlxs_port_t *port, 757 HBA_WWN *portname); 758 extern void emlxs_log_sd_lsrjt_event(emlxs_port_t *port, 759 HBA_WWN *remoteport, uint32_t orig_cmd, 760 uint32_t reason, uint32_t reason_expl); 761 extern void emlxs_log_sd_fc_bsy_event(emlxs_port_t *port, 762 HBA_WWN *remoteport); 763 extern void emlxs_log_sd_fc_rdchk_event(emlxs_port_t *port, 764 HBA_WWN *remoteport, uint32_t lun, 765 uint32_t opcode, uint32_t fcp_param); 766 extern void emlxs_log_sd_scsi_event(emlxs_port_t *port, 767 uint32_t type, HBA_WWN *remoteport, 768 int32_t lun); 769 extern void emlxs_log_sd_scsi_check_event( 770 emlxs_port_t *port, 771 HBA_WWN *remoteport, uint32_t lun, 772 uint32_t cmdcode, uint32_t sensekey, 773 uint32_t asc, uint32_t ascq); 774 #endif /* SAN_DIAG_SUPPORT */ 775 776 777 #ifdef DUMP_SUPPORT 778 /* Module emlxs_dump.c External Routine Declarations */ 779 extern uint32_t emlxs_dump_drv_event(emlxs_hba_t *hba); 780 extern uint32_t emlxs_dump_user_event(emlxs_hba_t *hba); 781 extern uint32_t emlxs_dump_temp_event(emlxs_hba_t *hba, 782 uint32_t tempType, uint32_t temp); 783 extern void emlxs_dump_drv_thread(emlxs_hba_t *hba, 784 void *arg1, void *arg2); 785 extern void emlxs_dump_user_thread(emlxs_hba_t *hba, 786 void *arg1, void *arg2); 787 extern void emlxs_dump_temp_thread(emlxs_hba_t *hba, 788 void *arg1, void *arg2); 789 extern uint32_t emlxs_ftell(emlxs_file_t *fp); 790 extern uint32_t emlxs_get_dump(emlxs_hba_t *hba, uint8_t *buffer, 791 uint32_t *buflen); 792 extern void emlxs_dump_wait(emlxs_hba_t *hba); 793 extern void emlxs_dump(emlxs_hba_t *hba, uint32_t type, 794 uint32_t temp_type, uint32_t temp); 795 796 #endif /* DUMP_SUPPORT */ 797 798 #ifdef __cplusplus 799 } 800 #endif 801 802 #endif /* _EMLXS_EXTERN_H */ 803