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  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 /*
  27  * Copyright 2019 Joyent, Inc.
  28  */
  29 
  30 #ifndef _FP_H
  31 #define _FP_H
  32 
  33 
  34 #include <sys/note.h>
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 /*
  41  * Debugging, Error reporting, and tracing
  42  */
  43 #define FP_LOG_SIZE             1024 * 1024
  44 
  45 #define FP_LEVEL_1              0x00001         /* attach/detach PM CPR */
  46 #define FP_LEVEL_2              0x00002         /* startup */
  47 #define FP_LEVEL_3              0x00004         /* state change, discovery */
  48 #define FP_LEVEL_4              0x00008         /* statec/devc to ULPs */
  49 #define FP_LEVEL_5              0x00010         /* FCA UB callbacks */
  50 #define FP_LEVEL_6              0x00020         /* Name Server */
  51 #define FP_LEVEL_7              0x00040         /* RSCN */
  52 #define FP_LEVEL_8              0x00080         /* I/O tracing */
  53 #define FP_LEVEL_9              0x00100         /* Failure messages */
  54 
  55 
  56 /*
  57  * Log contents to system messages file
  58  */
  59 #define FP_MSG_LEVEL_1          (FP_LEVEL_1 | FC_TRACE_LOG_MSG)
  60 #define FP_MSG_LEVEL_2          (FP_LEVEL_2 | FC_TRACE_LOG_MSG)
  61 #define FP_MSG_LEVEL_3          (FP_LEVEL_3 | FC_TRACE_LOG_MSG)
  62 #define FP_MSG_LEVEL_4          (FP_LEVEL_4 | FC_TRACE_LOG_MSG)
  63 #define FP_MSG_LEVEL_5          (FP_LEVEL_5 | FC_TRACE_LOG_MSG)
  64 #define FP_MSG_LEVEL_6          (FP_LEVEL_6 | FC_TRACE_LOG_MSG)
  65 #define FP_MSG_LEVEL_7          (FP_LEVEL_7 | FC_TRACE_LOG_MSG)
  66 #define FP_MSG_LEVEL_8          (FP_LEVEL_8 | FC_TRACE_LOG_MSG)
  67 #define FP_MSG_LEVEL_9          (FP_LEVEL_9 | FC_TRACE_LOG_MSG)
  68 
  69 
  70 /*
  71  * Log contents to trace buffer
  72  */
  73 #define FP_BUF_LEVEL_1          (FP_LEVEL_1 | FC_TRACE_LOG_BUF)
  74 #define FP_BUF_LEVEL_2          (FP_LEVEL_2 | FC_TRACE_LOG_BUF)
  75 #define FP_BUF_LEVEL_3          (FP_LEVEL_3 | FC_TRACE_LOG_BUF)
  76 #define FP_BUF_LEVEL_4          (FP_LEVEL_4 | FC_TRACE_LOG_BUF)
  77 #define FP_BUF_LEVEL_5          (FP_LEVEL_5 | FC_TRACE_LOG_BUF)
  78 #define FP_BUF_LEVEL_6          (FP_LEVEL_6 | FC_TRACE_LOG_BUF)
  79 #define FP_BUF_LEVEL_7          (FP_LEVEL_7 | FC_TRACE_LOG_BUF)
  80 #define FP_BUF_LEVEL_8          (FP_LEVEL_8 | FC_TRACE_LOG_BUF)
  81 #define FP_BUF_LEVEL_9          (FP_LEVEL_9 | FC_TRACE_LOG_BUF)
  82 
  83 
  84 /*
  85  * Log contents to both system messages file and trace buffer
  86  */
  87 #define FP_MSG_BUF_LEVEL_1      (FP_LEVEL_1 | FC_TRACE_LOG_BUF |\
  88                                 FC_TRACE_LOG_MSG)
  89 #define FP_MSG_BUF_LEVEL_2      (FP_LEVEL_2 | FC_TRACE_LOG_BUF |\
  90                                 FC_TRACE_LOG_MSG)
  91 #define FP_MSG_BUF_LEVEL_3      (FP_LEVEL_3 | FC_TRACE_LOG_BUF |\
  92                                 FC_TRACE_LOG_MSG)
  93 #define FP_MSG_BUF_LEVEL_4      (FP_LEVEL_4 | FC_TRACE_LOG_BUF |\
  94                                 FC_TRACE_LOG_MSG)
  95 #define FP_MSG_BUF_LEVEL_5      (FP_LEVEL_5 | FC_TRACE_LOG_BUF |\
  96                                 FC_TRACE_LOG_MSG)
  97 #define FP_MSG_BUF_LEVEL_6      (FP_LEVEL_6 | FC_TRACE_LOG_BUF |\
  98                                 FC_TRACE_LOG_MSG)
  99 #define FP_MSG_BUF_LEVEL_7      (FP_LEVEL_7 | FC_TRACE_LOG_BUF |\
 100                                 FC_TRACE_LOG_MSG)
 101 #define FP_MSG_BUF_LEVEL_8      (FP_LEVEL_8 | FC_TRACE_LOG_BUF |\
 102                                 FC_TRACE_LOG_MSG)
 103 #define FP_MSG_BUF_LEVEL_9      (FP_LEVEL_9 | FC_TRACE_LOG_BUF |\
 104                                 FC_TRACE_LOG_MSG)
 105 
 106 /*
 107  * Log contents to system messages file, console and trace buffer
 108  */
 109 #define FP_MSG_BUF_CONSOLE_LEVEL_1      (FP_LEVEL_1 | FC_TRACE_LOG_BUF |\
 110                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 111 #define FP_MSG_BUF_CONSOLE_LEVEL_2      (FP_LEVEL_2 | FC_TRACE_LOG_BUF |\
 112                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 113 #define FP_MSG_BUF_CONSOLE_LEVEL_3      (FP_LEVEL_3 | FC_TRACE_LOG_BUF |\
 114                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 115 #define FP_MSG_BUF_CONSOLE_LEVEL_4      (FP_LEVEL_4 | FC_TRACE_LOG_BUF |\
 116                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 117 #define FP_MSG_BUF_CONSOLE_LEVEL_5      (FP_LEVEL_5 | FC_TRACE_LOG_BUF |\
 118                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 119 #define FP_MSG_BUF_CONSOLE_LEVEL_6      (FP_LEVEL_6 | FC_TRACE_LOG_BUF |\
 120                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 121 #define FP_MSG_BUF_CONSOLE_LEVEL_7      (FP_LEVEL_7 | FC_TRACE_LOG_BUF |\
 122                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 123 #define FP_MSG_BUF_CONSOLE_LEVEL_8      (FP_LEVEL_8 | FC_TRACE_LOG_BUF |\
 124                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 125 #define FP_MSG_BUF_CONSOLE_LEVEL_9      (FP_LEVEL_9 | FC_TRACE_LOG_BUF |\
 126                                         FC_TRACE_LOG_MSG | FC_TRACE_LOG_CONSOLE)
 127 #ifdef DEBUG
 128 
 129 #define FP_DTRACE               fc_trace_debug
 130 
 131 #else
 132 
 133 #define FP_DTRACE(...)          (void)(0)
 134 
 135 #endif
 136 
 137 #define FP_TRACE                fc_trace_debug
 138 
 139 
 140 #ifdef  DEBUG
 141 
 142 #define FP_TRACE_DEFAULT        (FC_TRACE_LOG_MASK | FP_LEVEL_1 |\
 143                                 FP_LEVEL_2 | FP_LEVEL_3 |\
 144                                 FP_LEVEL_4 | FP_LEVEL_5 |\
 145                                 FP_LEVEL_6 | FP_LEVEL_7 | FP_LEVEL_9)
 146 
 147 #else
 148 
 149 #define FP_TRACE_DEFAULT        (FC_TRACE_LOG_MASK | FP_LEVEL_1 |\
 150                                 FP_LEVEL_2 | FP_LEVEL_3 |\
 151                                 FP_LEVEL_4 | FP_LEVEL_5 |\
 152                                 FP_LEVEL_6 | FP_LEVEL_7 | FP_LEVEL_9)
 153 #endif
 154 
 155 #define FP_THEAD(x, y, z)       fp_logq, x->fp_ibuf, fp_trace, y, z
 156 
 157 #define FP_NHEAD1(x, y)         FP_THEAD(port, FP_BUF_LEVEL_##x, y)
 158 
 159 #define FP_NHEAD2(x, y)         FP_THEAD(port, FP_MSG_BUF_LEVEL_##x, y)
 160 
 161 #define FP_NHEAD3(x, y)         FP_THEAD(port, FP_MSG_BUF_CONSOLE_LEVEL_##x, y)
 162 
 163 
 164 /* This is used in about a dozen or so places in fp.c */
 165 #define FP_IS_PKT_ERROR(pkt)    (((pkt)->pkt_state != FC_PKT_SUCCESS) ||\
 166                                 ((pkt)->pkt_state == FC_PKT_SUCCESS &&\
 167                                 (pkt)->pkt_resp_resid != 0))
 168 
 169 
 170 /*
 171  * This is only used in fp_ns_init() and fp_fabric_online().
 172  */
 173 #define FP_MAX_DEVICES                  255
 174 
 175 
 176 /*
 177  * Software restoration bit fields while doing (PM)SUSPEND/(PM)RESUME
 178  * Used with the fp_restore field in the fc_local_port_t struct.
 179  */
 180 #define FP_RESTORE_WAIT_TIMEOUT         0x01
 181 #define FP_RESTORE_OFFLINE_TIMEOUT      0x02
 182 #define FP_ELS_TIMEOUT          (20)
 183 #define FP_NS_TIMEOUT           (120)
 184 #define FP_IS_F_PORT(p)         ((p) & 0x1000)
 185 #define FP_RETRY_COUNT          (5)
 186 #define FP_RETRY_DELAY          (3)                     /* E_D_TOV + 1 second */
 187 #define FP_OFFLINE_TICKER       (90)                    /* seconds */
 188 #define FP_DEFAULT_SID          (0x000AE)               /* Used once */
 189 #define FP_DEFAULT_DID          (0x000EA)               /* Used once */
 190 #define FP_PORT_IDENTIFIER_LEN  (4)
 191 #define FP_UNSOL_BUF_COUNT      (20)
 192 #define FP_UNSOL_BUF_SIZE       (sizeof (la_els_logi_t))
 193 #define FP_CMDWAIT_DELAY        (240)   /* Enough time for all cmds to complt */
 194 
 195 
 196 /*
 197  * Values and macros  used with fp_task and fp_last_task fields in
 198  * the fc_local_port_t struct. Also see fp_job_handler() for more info.
 199  */
 200 #define FP_TASK_IDLE                    0
 201 #define FP_TASK_PORT_STARTUP            1
 202 #define FP_TASK_OFFLINE                 2
 203 #define FP_TASK_ONLINE                  3
 204 #define FP_TASK_GETMAP                  4
 205 
 206 
 207 /*
 208  * cmd_flags
 209  */
 210 #define FP_CMD_CFLAG_UNDEFINED          (-1)
 211 #define FP_CMD_PLOGI_DONT_CARE          0x00
 212 #define FP_CMD_PLOGI_RETAIN             0x01    /* Retain LOGIN */
 213 #define FP_CMD_DELDEV_ON_ERROR          0x02    /* Remove device on error */
 214 
 215 /*
 216  * cmd_dflags
 217  */
 218 #define FP_CMD_VALID_DMA_MEM            0x01
 219 #define FP_CMD_VALID_DMA_BIND           0x02
 220 #define FP_RESP_VALID_DMA_MEM           0x04
 221 #define FP_RESP_VALID_DMA_BIND          0x08
 222 
 223 
 224 /* Values for fp_flag field in the fc_local_port_t struct */
 225 #define FP_IDLE         0x00
 226 #define FP_OPEN         0x01
 227 #define FP_EXCL         0x02
 228 #define FP_EXCL_BUSY    0x04    /* Exclusive operation in progress */
 229 
 230 
 231 /* message block/unblock'ing */
 232 #define FP_WARNING_MESSAGES             0x01
 233 #define FP_FATAL_MESSAGES               0x02
 234 
 235 
 236 #define FP_IS_CLASS_1_OR_2(x)   \
 237         ((x) == FC_TRAN_CLASS1 || (x) == FC_TRAN_CLASS2)
 238 
 239 
 240 /*
 241  * Driver message control
 242  */
 243 typedef enum fp_mesg_dest {
 244         FP_CONSOLE_ONLY,
 245         FP_LOG_ONLY,
 246         FP_LOG_AND_CONSOLE
 247 } fp_mesg_dest_t;
 248 
 249 typedef struct soft_attach {
 250         fc_attach_cmd_t         att_cmd;
 251         struct fc_local_port    *att_port;
 252         boolean_t               att_need_pm_idle;
 253 } fp_soft_attach_t;
 254 
 255 typedef struct fp_cmd {
 256         uint16_t        cmd_dflags;             /* DMA flags */
 257         ksema_t         cmd_sema;
 258         int             cmd_flags;              /* cmd flags */
 259         int             cmd_retry_count;
 260         int             cmd_retry_interval;     /* milli secs */
 261         fc_packet_t     cmd_pkt;
 262         fc_local_port_t *cmd_port;
 263         opaque_t        cmd_private;
 264         struct fp_cmd   *cmd_next;
 265         fc_packet_t     *cmd_ulp_pkt;
 266         job_request_t   *cmd_job;
 267         int (*cmd_transport) (opaque_t fca_handle, fc_packet_t *);
 268 } fp_cmd_t;
 269 
 270 typedef struct fp_unsol_spec {
 271         fc_local_port_t *port;
 272         fc_unsol_buf_t  *buf;
 273 } fp_unsol_spec_t;
 274 
 275 
 276 #if     !defined(__lint)
 277 _NOTE(SCHEME_PROTECTS_DATA("unique per request", fp_cmd))
 278 _NOTE(SCHEME_PROTECTS_DATA("unique per request", soft_attach))
 279 _NOTE(SCHEME_PROTECTS_DATA("unique per request", fp_unsol_spec))
 280 #endif  /* __lint */
 281 
 282 /*
 283  * Procedure templates.
 284  */
 285 static int fp_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
 286 static int fp_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
 287 static int fp_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd,
 288     void *arg, void **result);
 289 static int fp_power(dev_info_t *dip, int comp, int level);
 290 static int fp_open(dev_t *devp, int flag, int otype, cred_t *credp);
 291 static int fp_close(dev_t dev, int flag, int otype, cred_t *credp);
 292 static int fp_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
 293     cred_t *credp, int *rval);
 294 static int fp_attach_handler(dev_info_t *dip);
 295 static int fp_resume_handler(dev_info_t *dip);
 296 static int fp_power_up(fc_local_port_t *port);
 297 static int fp_resume_all(fc_local_port_t *port, fc_attach_cmd_t cmd);
 298 static int fp_detach_handler(fc_local_port_t *port);
 299 static int fp_suspend_handler(fc_local_port_t *port);
 300 static int fp_power_down(fc_local_port_t *port);
 301 static void fp_suspend_all(fc_local_port_t *port);
 302 static int fp_cache_constructor(void *buf, void *cdarg, int kmflags);
 303 static void fp_cache_destructor(void *buf, void *cdarg);
 304 static fp_cmd_t *fp_alloc_pkt(fc_local_port_t *port, int cmd_len,
 305     int resp_len, int kmflags, fc_remote_port_t *pd);
 306 static void fp_free_pkt(fp_cmd_t *cmd);
 307 static void fp_free_dma(fp_cmd_t *cmd);
 308 static void fp_job_handler(fc_local_port_t *port);
 309 static int fp_port_startup(fc_local_port_t *port, job_request_t *job);
 310 static void fp_startup_done(opaque_t arg, uchar_t result);
 311 static void fp_ulp_port_attach(void *arg);
 312 static int fp_sendcmd(fc_local_port_t *port, fp_cmd_t *cmd,
 313     opaque_t fca_handle);
 314 static void fp_resendcmd(void *port_handle);
 315 static int fp_retry_cmd(fc_packet_t *pkt);
 316 static void fp_enque_cmd(fc_local_port_t *port, fp_cmd_t *cmd);
 317 static int fp_handle_reject(fc_packet_t *pkt);
 318 static uchar_t fp_get_nextclass(fc_local_port_t *port, uchar_t cur_class);
 319 static int fp_is_class_supported(uint32_t cos, uchar_t tran_class);
 320 static fp_cmd_t *fp_deque_cmd(fc_local_port_t *port);
 321 static void fp_jobwait(job_request_t *job);
 322 int fp_state_to_rval(uchar_t state);
 323 static void fp_iodone(fp_cmd_t *cmd);
 324 static void fp_jobdone(job_request_t *job);
 325 static void fp_port_shutdown(fc_local_port_t *port, job_request_t *job);
 326 static void fp_get_loopmap(fc_local_port_t *port, job_request_t *job);
 327 static void fp_loop_online(fc_local_port_t *port, job_request_t *job,
 328     int orphan);
 329 static int fp_get_lilpmap(fc_local_port_t *port, fc_lilpmap_t *lilp_map);
 330 static int fp_fabric_login(fc_local_port_t *port, uint32_t s_id,
 331     job_request_t *job, int flag, int sleep);
 332 static int fp_port_login(fc_local_port_t *port, uint32_t d_id,
 333     job_request_t *job, int cmd_flag, int sleep, fc_remote_port_t *pd,
 334     fc_packet_t *ulp_pkt);
 335 static void fp_register_login(ddi_acc_handle_t *handle, fc_remote_port_t *pd,
 336     la_els_logi_t *acc, uchar_t class);
 337 static void fp_remote_port_offline(fc_remote_port_t *pd);
 338 static void fp_unregister_login(fc_remote_port_t *pd);
 339 static void fp_port_offline(fc_local_port_t *port, int notify);
 340 static void fp_offline_timeout(void *port_handle);
 341 static void fp_els_init(fp_cmd_t *cmd, uint32_t s_id, uint32_t d_id,
 342     void (*comp) (), job_request_t *job);
 343 static void fp_xlogi_init(fc_local_port_t *port, fp_cmd_t *cmd, uint32_t s_id,
 344     uint32_t d_id, void (*intr) (), job_request_t *job, uchar_t ls_code);
 345 static void fp_logo_init(fc_remote_port_t *pd, fp_cmd_t *cmd,
 346     job_request_t *job);
 347 static void fp_adisc_init(fp_cmd_t *cmd, job_request_t *job);
 348 static int fp_ulp_statec_cb(fc_local_port_t *port, uint32_t state,
 349     fc_portmap_t *changelist, uint32_t listlen, uint32_t alloc_len, int sleep);
 350 static int fp_ulp_devc_cb(fc_local_port_t *port, fc_portmap_t *changelist,
 351     uint32_t listlen, uint32_t alloc_len, int sleep, int sync);
 352 static void fp_plogi_group(fc_local_port_t *port, job_request_t *job);
 353 static void fp_ns_init(fc_local_port_t *port, job_request_t *job, int sleep);
 354 static void fp_ns_fini(fc_local_port_t *port, job_request_t *job);
 355 static int fp_ns_reg(fc_local_port_t *port, fc_remote_port_t *pd,
 356     uint16_t cmd_code, job_request_t *job, int polled, int sleep);
 357 static int fp_common_intr(fc_packet_t *pkt, int iodone);
 358 static void fp_flogi_intr(fc_packet_t *pkt);
 359 static void fp_plogi_intr(fc_packet_t *pkt);
 360 static void fp_adisc_intr(fc_packet_t *pkt);
 361 static void fp_logo_intr(fc_packet_t *pkt);
 362 static void fp_rls_intr(fc_packet_t *pkt);
 363 static void fp_rnid_intr(fc_packet_t *pkt);
 364 static int  fp_send_rnid(fc_local_port_t *port, intptr_t data, int mode,
 365     fcio_t *fcio, la_wwn_t *pwwn);
 366 static int  fp_get_rnid(fc_local_port_t *port, intptr_t data, int mode,
 367     fcio_t *fcio);
 368 static int  fp_set_rnid(fc_local_port_t *port, intptr_t data, int mode,
 369     fcio_t *fcio);
 370 static void fp_intr(fc_packet_t *pkt);
 371 static void fp_statec_cb(opaque_t port_handle, uint32_t state);
 372 static int fp_ns_scr(fc_local_port_t *port, job_request_t *job,
 373     uchar_t scr_func, int sleep);
 374 static int fp_ns_get_devcount(fc_local_port_t *port, job_request_t *job,
 375     int create, int sleep);
 376 static int fp_fciocmd(fc_local_port_t *port, intptr_t data, int mode,
 377     fcio_t *fcio);
 378 static int fp_copyout(void *from, void *to, size_t len, int mode);
 379 static int fp_fcio_copyout(fcio_t *fcio, intptr_t data, int mode);
 380 static void fp_p2p_online(fc_local_port_t *port, job_request_t *job);
 381 static int fp_fillout_p2pmap(fc_local_port_t *port, fcio_t *fcio, int mode);
 382 static void fp_fabric_online(fc_local_port_t *port, job_request_t *job);
 383 static int fp_fillout_loopmap(fc_local_port_t *port, fcio_t *fcio, int mode);
 384 static void fp_unsol_intr(fc_packet_t *pkt);
 385 static void fp_linit_intr(fc_packet_t *pkt);
 386 static void fp_unsol_cb(opaque_t port_handle, fc_unsol_buf_t *buf,
 387     uint32_t type);
 388 static void fp_handle_unsol_buf(fc_local_port_t *port, fc_unsol_buf_t *buf,
 389     job_request_t *job);
 390 static void fp_ba_rjt_init(fc_local_port_t *port, fp_cmd_t *cmd,
 391     fc_unsol_buf_t *buf, job_request_t *job);
 392 static void fp_els_rjt_init(fc_local_port_t *port, fp_cmd_t *cmd,
 393     fc_unsol_buf_t *buf, uchar_t action, uchar_t reason, job_request_t *job);
 394 static void fp_els_acc_init(fc_local_port_t *port, fp_cmd_t *cmd,
 395     fc_unsol_buf_t *buf, job_request_t *job);
 396 static void fp_handle_unsol_logo(fc_local_port_t *port, fc_unsol_buf_t *buf,
 397     fc_remote_port_t *pd, job_request_t *job);
 398 static void fp_handle_unsol_prlo(fc_local_port_t *port, fc_unsol_buf_t *buf,
 399     fc_remote_port_t *pd, job_request_t *job);
 400 static void fp_unsol_resp_init(fc_packet_t *pkt, fc_unsol_buf_t *buf,
 401     uchar_t r_ctl, uchar_t type);
 402 static void fp_i_handle_unsol_els(fc_local_port_t *port, fc_unsol_buf_t *buf);
 403 static void fp_handle_unsol_plogi(fc_local_port_t *port, fc_unsol_buf_t *buf,
 404     job_request_t *job, int sleep);
 405 static void fp_handle_unsol_flogi(fc_local_port_t *port, fc_unsol_buf_t *buf,
 406     job_request_t *job, int sleep);
 407 static void fp_login_acc_init(fc_local_port_t *port, fp_cmd_t *cmd,
 408     fc_unsol_buf_t *buf, job_request_t *job, int sleep);
 409 static void fp_handle_unsol_rscn(fc_local_port_t *port, fc_unsol_buf_t *buf,
 410     job_request_t *job, int sleep);
 411 static void fp_fillout_old_map_held(fc_portmap_t *map, fc_remote_port_t *pd,
 412     uchar_t flag);
 413 static void fp_fillout_old_map(fc_portmap_t *map, fc_remote_port_t *pd,
 414     uchar_t flag);
 415 static void fp_fillout_changed_map(fc_portmap_t *map, fc_remote_port_t *pd,
 416     uint32_t *new_did, la_wwn_t *new_pwwn);
 417 static void fp_fillout_new_nsmap(fc_local_port_t *port,
 418     ddi_acc_handle_t *handle, fc_portmap_t *port_map, ns_resp_gan_t *gan_resp,
 419     uint32_t d_id);
 420 static int fp_remote_lip(fc_local_port_t *port, la_wwn_t *pwwn, int sleep,
 421     job_request_t *job);
 422 static void fp_stuff_device_with_gan(ddi_acc_handle_t *handle,
 423     fc_remote_port_t *pd, ns_resp_gan_t *gan_resp);
 424 static int fp_ns_query(fc_local_port_t *port, fctl_ns_req_t *ns_cmd,
 425     job_request_t *job, int polled, int sleep);
 426 static void fp_ct_init(fc_local_port_t *port, fp_cmd_t *cmd,
 427     fctl_ns_req_t *ns_cmd, uint16_t cmd_code, caddr_t cmd_buf,
 428     uint16_t cmd_len, uint16_t resp_len, job_request_t *job);
 429 static void fp_ns_intr(fc_packet_t *pkt);
 430 static void fp_gan_handler(fc_packet_t *pkt, fctl_ns_req_t *ns_cmd);
 431 static void fp_ns_query_handler(fc_packet_t *pkt, fctl_ns_req_t *ns_cmd);
 432 static void fp_handle_unsol_adisc(fc_local_port_t *port, fc_unsol_buf_t *buf,
 433     fc_remote_port_t *pd, job_request_t *job);
 434 static void fp_adisc_acc_init(fc_local_port_t *port, fp_cmd_t *cmd,
 435     fc_unsol_buf_t *buf, job_request_t *job);
 436 static void fp_load_ulp_modules(dev_info_t *dip, fc_local_port_t *port);
 437 static int fp_logout(fc_local_port_t *port, fc_remote_port_t *pd,
 438     job_request_t *job);
 439 static void fp_attach_ulps(fc_local_port_t *port, fc_attach_cmd_t cmd);
 440 static int fp_ulp_notify(fc_local_port_t *port, uint32_t statec, int sleep);
 441 static int fp_ns_getmap(fc_local_port_t *port, job_request_t *job,
 442     fc_portmap_t **map, uint32_t *len, uint32_t sid);
 443 static fc_remote_port_t *fp_create_remote_port_by_ns(fc_local_port_t *port,
 444     uint32_t d_id, int sleep);
 445 static int fp_check_perms(uchar_t open_flag, uint16_t ioctl_cmd);
 446 static int fp_bind_callbacks(fc_local_port_t *port);
 447 static void fp_retrieve_caps(fc_local_port_t *port);
 448 static void fp_validate_area_domain(fc_local_port_t *port, uint32_t id,
 449     uint32_t mask, job_request_t *job, int sleep);
 450 static void fp_validate_rscn_page(fc_local_port_t *port, fc_affected_id_t *page,
 451     job_request_t *job, fctl_ns_req_t *ns_cmd, fc_portmap_t *listptr,
 452     int *listindex, int sleep);
 453 static int fp_ns_validate_device(fc_local_port_t *port, fc_remote_port_t *pd,
 454     job_request_t *job, int polled, int sleep);
 455 static int fp_validate_lilp_map(fc_lilpmap_t *lilp_map);
 456 static int fp_is_valid_alpa(uchar_t al_pa);
 457 static void fp_ulp_unsol_cb(void *arg);
 458 static void fp_printf(fc_local_port_t *port, int level, fp_mesg_dest_t dest,
 459     int fc_errno, fc_packet_t *pkt, const char *fmt, ...);
 460 static int fp_fcio_logout(fc_local_port_t *port, fcio_t *fcio,
 461     job_request_t *job);
 462 static int fp_fcio_login(fc_local_port_t *port, fcio_t *fcio,
 463     job_request_t *job);
 464 
 465 #ifdef  __cplusplus
 466 }
 467 #endif
 468 
 469 #endif  /* _FP_H */