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