diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/lib/libdtrace/common/fc.d | 182 | ||||
-rw-r--r-- | usr/src/lib/libdtrace/common/scsi.d | 43 | ||||
-rw-r--r-- | usr/src/uts/common/dtrace/sdt_subr.c | 91 | ||||
-rw-r--r-- | usr/src/uts/common/io/comstar/port/fct/discovery.c | 67 | ||||
-rw-r--r-- | usr/src/uts/common/io/comstar/port/fct/fct.c | 143 | ||||
-rw-r--r-- | usr/src/uts/common/io/comstar/port/qlt/qlt.c | 129 | ||||
-rw-r--r-- | usr/src/uts/common/sys/fct.h | 5 | ||||
-rw-r--r-- | usr/src/uts/common/sys/fct_defines.h | 7 | ||||
-rw-r--r-- | usr/src/uts/common/sys/sdt.h | 24 |
9 files changed, 568 insertions, 123 deletions
diff --git a/usr/src/lib/libdtrace/common/fc.d b/usr/src/lib/libdtrace/common/fc.d new file mode 100644 index 0000000000..afe1f2baa7 --- /dev/null +++ b/usr/src/lib/libdtrace/common/fc.d @@ -0,0 +1,182 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma D depends_on library net.d +#pragma D depends_on library scsi.d +#pragma D depends_on module genunix + +/* + * FC port information. + */ +typedef struct fc_port_info { + string fcp_node_wwn; /* node WWN */ + string fcp_sym_node_name; /* node symbolic name */ + string fcp_sym_port_name; /* port symbolic name */ + uint32_t fcp_port_hard_address; /* port hard address */ +} fc_port_info_t; + +/* + * FC transfer info (somewhat analogous to iscsiinfo_t) + * Represents data transfer details. + */ +typedef struct fc_xferinfo { + uint32_t fcx_len; + uint32_t fcx_offset; + uint16_t fcx_flags; /* db_flags as defined in sys/stmf.h */ +} fc_xferinfo_t; + +/* + * conninfo translators + */ + +/* + * Translator for conninfo, translating from the local port. + */ +#pragma D binding "1.5" translator +translator conninfo_t < fct_local_port_t *P > { + ci_local = P->port_pwwn_str[0] ? + P->port_pwwn_str : "<unknown>"; + ci_remote = "<unknown>"; + ci_protocol = "fc"; +}; + +/* + * Translator for conninfo, translating from the local port implementation. + */ +#pragma D binding "1.5" translator +translator conninfo_t < fct_i_local_port_t *P > { + ci_local = P->iport_port->port_pwwn_str[0] ? + P->iport_port->port_pwwn_str : "<unknown>"; + ci_remote = "<unknown>"; + ci_protocol = "fc"; +}; + +/* + * Translator for conninfo, translating from fct cmd struct. + */ +#pragma D binding "1.5" translator +translator conninfo_t < fct_cmd_t *C > { + ci_local = (C->cmd_port ? + (C->cmd_port->port_pwwn_str[0] ? + C->cmd_port->port_pwwn_str : "<unknown>") : + "<unknown>"); + + ci_remote = (C->cmd_rp ? + (C->cmd_rp->rp_pwwn_str[0] ? + C->cmd_rp->rp_pwwn_str : "<unknown>") : + "<unknown>"); + + ci_protocol = "fc"; +}; + + +/* + * fc_port_info_t translators. + */ + +/* + * Translator for fc_port_info_t, translating from the local port. + */ +#pragma D binding "1.5" translator +translator fc_port_info_t < fct_local_port_t *P > { + /* node WWN */ + fcp_node_wwn = P->port_nwwn_str[0] ? + P->port_nwwn_str : "<unknown>"; + + /* node symbolic name */ + fcp_sym_node_name = P->port_sym_node_name ? + P->port_sym_node_name : `utsname.nodename; + + /* port symbolic name */ + fcp_sym_port_name = P->port_sym_port_name ? + P->port_sym_port_name : "<unknown>"; + + /* port hard address */ + fcp_port_hard_address = P->port_hard_address; +}; + + +/* + * Translator for fc_port_info_t, translating from the local port impl. + */ +#pragma D binding "1.5" translator +translator fc_port_info_t < fct_i_local_port_t *P > { + /* node WWN */ + + fcp_node_wwn = (P->iport_port ? + (P->iport_port->port_nwwn_str[0] ? + P->iport_port->port_nwwn_str : + "<unknown>") : + "<bad iport_port ptr>"); + + fcp_sym_node_name = + (P->iport_port ? + (P->iport_port->port_sym_node_name ? + P->iport_port->port_sym_node_name : "<unknown>") : + "<bad iport_port ptr>"); + + fcp_sym_port_name = + (P->iport_port ? + (P->iport_port->port_sym_port_name ? + P->iport_port->port_sym_port_name : "<unknown>") : + "<bad iport_port ptr>"); + + fcp_port_hard_address = + (P->iport_port ? + P->iport_port->port_hard_address : 0); +}; + +/* + * Translator for fc_port_info, translating from the remote port impl + */ +#pragma D binding "1.5" translator +translator fc_port_info_t < fct_i_remote_port_t *P > { + + /* node WWN */ + fcp_node_wwn = P->irp_rp ? + (P->irp_rp->rp_nwwn_str[0] ? + P->irp_rp->rp_nwwn_str : "<unknown>") : + "<unknown>"; + + /* node symbolic name */ + fcp_sym_node_name = P->irp_snn ? P->irp_snn : "<unknown>"; + + /* port symbolic name */ + fcp_sym_port_name = P->irp_spn ? P->irp_spn : "<unknown>"; + + /* port hard address */ + fcp_port_hard_address = P->irp_rp ? P->irp_rp->rp_id : 0; +}; + +/* + * Translator for fc_xferinfo, translating from stmf_data_buf_t. + */ +#pragma D binding "1.5" translator +translator fc_xferinfo_t < stmf_data_buf_t *B > { + fcx_len = B->db_data_size; + fcx_offset = B->db_relative_offset; + fcx_flags = B->db_flags; +}; diff --git a/usr/src/lib/libdtrace/common/scsi.d b/usr/src/lib/libdtrace/common/scsi.d new file mode 100644 index 0000000000..29ccdeb237 --- /dev/null +++ b/usr/src/lib/libdtrace/common/scsi.d @@ -0,0 +1,43 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * The scsicmd_t structure should be used by providers + * to represent a SCSI command block (cdb). + */ +typedef struct scsicmd { + uint64_t ic_len; /* CDB length */ + uint8_t *ic_cdb; /* CDB data */ +} scsicmd_t; + +/* + * Translator for scsicmd_t, translating from a scsi_task_t + */ +#pragma D binding "1.5" translator +translator scsicmd_t < scsi_task_t *T > { + ic_len = T->task_cdb_length; + ic_cdb = T->task_cdb; +}; diff --git a/usr/src/uts/common/dtrace/sdt_subr.c b/usr/src/uts/common/dtrace/sdt_subr.c index 20aabcc208..c80e7cc6d4 100644 --- a/usr/src/uts/common/dtrace/sdt_subr.c +++ b/usr/src/uts/common/dtrace/sdt_subr.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/sdt_impl.h> static dtrace_pattr_t vtrace_attr = { @@ -43,6 +41,14 @@ static dtrace_pattr_t info_attr = { { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, }; +static dtrace_pattr_t fc_attr = { +{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA }, +{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, +{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, +{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_ISA }, +{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA }, +}; + static dtrace_pattr_t fpu_attr = { { DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_ISA }, { DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN }, @@ -97,6 +103,7 @@ sdt_provider_t sdt_providers[] = { { "nfsv3", "__nfsv3_", &stab_attr, 0 }, { "nfsv4", "__nfsv4_", &stab_attr, 0 }, { "xpv", "__xpv_", &xpv_attr, 0 }, + { "fc", "__fc_", &fc_attr, 0 }, { "sysevent", "__sysevent_", &stab_attr, 0 }, { "sdt", NULL, &sdt_attr, 0 }, { NULL } @@ -864,6 +871,84 @@ sdt_argdesc_t sdt_args[] = { { "xpv", "setvcpucontext-end", 0, 0, "int" }, { "xpv", "setvcpucontext-start", 0, 0, "domid_t" }, { "xpv", "setvcpucontext-start", 1, 1, "vcpu_guest_context_t *" }, + + { "fc", "link-up", 0, 0, "fct_i_local_port_t *", "conninfo_t *" }, + { "fc", "link-down", 0, 0, "fct_i_local_port_t *", "conninfo_t *" }, + { "fc", "fabric-login-start", 0, 0, "fct_i_local_port_t *", + "conninfo_t *" }, + { "fc", "fabric-login-start", 1, 0, "fct_i_local_port_t *", + "fc_port_info_t *" }, + { "fc", "fabric-login-end", 0, 0, "fct_i_local_port_t *", + "conninfo_t *" }, + { "fc", "fabric-login-end", 1, 0, "fct_i_local_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-login-start", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "rport-login-start", 1, 1, "fct_local_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-login-start", 2, 2, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-login-start", 3, 3, "int", "int" }, + { "fc", "rport-login-end", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "rport-login-end", 1, 1, "fct_local_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-login-end", 2, 2, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-login-end", 3, 3, "int", "int" }, + { "fc", "rport-login-end", 4, 4, "int", "int" }, + { "fc", "rport-logout-start", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "rport-logout-start", 1, 1, "fct_local_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-logout-start", 2, 2, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-logout-start", 3, 3, "int", "int" }, + { "fc", "rport-logout-end", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "rport-logout-end", 1, 1, "fct_local_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-logout-end", 2, 2, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "rport-logout-end", 3, 3, "int", "int" }, + { "fc", "scsi-command", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "scsi-command", 1, 1, "fct_i_local_port_t *", + "fc_port_info_t *" }, + { "fc", "scsi-command", 2, 2, "scsi_task_t *", + "scsicmd_t *" }, + { "fc", "scsi-command", 3, 3, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "scsi-response", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "scsi-response", 1, 1, "fct_i_local_port_t *", + "fc_port_info_t *" }, + { "fc", "scsi-response", 2, 2, "scsi_task_t *", + "scsicmd_t *" }, + { "fc", "scsi-response", 3, 3, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "xfer-start", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "xfer-start", 1, 1, "fct_i_local_port_t *", + "fc_port_info_t *" }, + { "fc", "xfer-start", 2, 2, "scsi_task_t *", + "scsicmd_t *" }, + { "fc", "xfer-start", 3, 3, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "xfer-start", 4, 4, "stmf_data_buf_t *", + "fc_xferinfo_t *" }, + { "fc", "xfer-done", 0, 0, "fct_cmd_t *", + "conninfo_t *" }, + { "fc", "xfer-done", 1, 1, "fct_i_local_port_t *", + "fc_port_info_t *" }, + { "fc", "xfer-done", 2, 2, "scsi_task_t *", + "scsicmd_t *" }, + { "fc", "xfer-done", 3, 3, "fct_i_remote_port_t *", + "fc_port_info_t *" }, + { "fc", "xfer-done", 4, 4, "stmf_data_buf_t *", + "fc_xferinfo_t *" }, + + { NULL } }; diff --git a/usr/src/uts/common/io/comstar/port/fct/discovery.c b/usr/src/uts/common/io/comstar/port/fct/discovery.c index 9db1776f39..13ad485bfc 100644 --- a/usr/src/uts/common/io/comstar/port/fct/discovery.c +++ b/usr/src/uts/common/io/comstar/port/fct/discovery.c @@ -34,6 +34,7 @@ #include <sys/byteorder.h> #include <sys/varargs.h> #include <sys/atomic.h> +#include <sys/sdt.h> #include <stmf.h> #include <stmf_ioctl.h> @@ -267,8 +268,16 @@ fct_handle_local_port_event(fct_i_local_port_t *iport) mutex_exit(&iport->iport_worker_lock); rw_enter(&iport->iport_lock, RW_WRITER); + + if (in->event_type == FCT_EVENT_LINK_UP) { + DTRACE_FC_1(link__up, fct_i_local_port_t, iport); + } else if (in->event_type == FCT_EVENT_LINK_DOWN) { + DTRACE_FC_1(link__down, fct_i_local_port_t, iport); + } + /* Calculate new state */ new_state = iport->iport_link_state; + if (in->event_type == FCT_EVENT_LINK_DOWN) { new_state = PORT_STATE_LINK_DOWN_CLEANING; } else if (in->event_type == FCT_EVENT_LINK_UP) { @@ -404,6 +413,8 @@ fct_do_flogi(fct_i_local_port_t *iport) int force_link_down = 0; int do_retry = 0; + DTRACE_FC_1(fabric__login__start, fct_i_local_port_t, iport); + bzero(&fx, sizeof (fx)); fx.fx_op = ELS_OP_FLOGI; if (iport->iport_login_retry == 0) { @@ -422,14 +433,14 @@ fct_do_flogi(fct_i_local_port_t *iport) mutex_enter(&iport->iport_worker_lock); if (IPORT_FLOGI_DONE(iport)) { /* The unsolicited path finished it. */ - return; + goto done; } if (ret == FCT_NOT_FOUND) { if (iport->iport_link_info.port_topology & PORT_TOPOLOGY_PRIVATE_LOOP) { /* This is a private loop. There is no switch. */ iport->iport_link_info.port_no_fct_flogi = 1; - return; + goto done; } /* * This is really an error. This means we cannot init the @@ -453,7 +464,7 @@ fct_do_flogi(fct_i_local_port_t *iport) iport->iport_login_retry++; if (iport->iport_login_retry >= 5) force_link_down = 1; - return; + goto done; } if (force_link_down) { @@ -464,7 +475,7 @@ fct_do_flogi(fct_i_local_port_t *iport) mutex_exit(&iport->iport_worker_lock); fct_handle_event(iport->iport_port, FCT_EVENT_LINK_DOWN, 0, 0); mutex_enter(&iport->iport_worker_lock); - return; + goto done; } /* FLOGI succeeded. Update local port state */ @@ -477,6 +488,10 @@ fct_do_flogi(fct_i_local_port_t *iport) iport->iport_link_info.portid = fx.fx_did; } iport->iport_link_info.port_fct_flogi_done = 1; + +done: + DTRACE_FC_1(fabric__login__end, + fct_i_local_port_t, iport); } /* @@ -1380,6 +1395,12 @@ fct_process_plogi(fct_i_cmd_t *icmd) clock_t end_time; char info[160]; + DTRACE_FC_4(rport__login__start, + fct_cmd_t, cmd, + fct_local_port_t, port, + fct_i_remote_port_t, irp, + int, (cmd_type != FCT_CMD_RCVD_ELS)); + /* Drain I/Os */ if ((irp->irp_nonfcp_xchg_count + irp->irp_fcp_xchg_count) > 1) { /* Trigger cleanup if necessary */ @@ -1439,6 +1460,11 @@ fct_process_plogi(fct_i_cmd_t *icmd) bcopy(p+28, rp->rp_nwwn, 8); bcopy(port->port_pwwn, p+20, 8); bcopy(port->port_nwwn, p+28, 8); + fct_wwn_to_str(rp->rp_pwwn_str, rp->rp_pwwn); + fct_wwn_to_str(rp->rp_nwwn_str, rp->rp_nwwn); + fct_wwn_to_str(port->port_pwwn_str, port->port_pwwn); + fct_wwn_to_str(port->port_nwwn_str, port->port_nwwn); + stmf_wwn_to_devid_desc((scsi_devid_desc_t *)irp->irp_id, rp->rp_pwwn, PROTOCOL_FIBRE_CHANNEL); } @@ -1498,12 +1524,26 @@ fct_process_plogi(fct_i_cmd_t *icmd) irp->irp_deregister_timer = 0; } if (icmd_flags & ICMD_IMPLICIT) { + DTRACE_FC_5(rport__login__end, + fct_cmd_t, cmd, + fct_local_port_t, port, + fct_i_remote_port_t, irp, + int, (cmd_type != FCT_CMD_RCVD_ELS), + int, FCT_SUCCESS); + p = els->els_resp_payload; p[0] = ELS_OP_ACC; cmd->cmd_comp_status = FCT_SUCCESS; fct_send_cmd_done(cmd, FCT_SUCCESS, FCT_IOF_FCA_DONE); } } else { + DTRACE_FC_5(rport__login__end, + fct_cmd_t, cmd, + fct_local_port_t, port, + fct_i_remote_port_t, irp, + int, (cmd_type != FCT_CMD_RCVD_ELS), + int, ret); + fct_queue_cmd_for_termination(cmd, ret); } @@ -1685,6 +1725,12 @@ fct_process_logo(fct_i_cmd_t *icmd) char info[160]; clock_t end_time; + DTRACE_FC_4(rport__logout__start, + fct_cmd_t, cmd, + fct_local_port_t, port, + fct_i_remote_port_t, irp, + int, (cmd->cmd_type != FCT_CMD_RCVD_ELS)); + /* Drain I/Os */ if ((irp->irp_nonfcp_xchg_count + irp->irp_fcp_xchg_count) > 1) { /* Trigger cleanup if necessary */ @@ -1752,7 +1798,20 @@ fct_process_logo(fct_i_cmd_t *icmd) if (ret != FCT_SUCCESS) { fct_queue_cmd_for_termination(cmd, ret); } + + DTRACE_FC_4(rport__logout__end, + fct_cmd_t, cmd, + fct_local_port_t, port, + fct_i_remote_port_t, irp, + int, (cmd->cmd_type != FCT_CMD_RCVD_ELS)); + } else { + DTRACE_FC_4(rport__logout__end, + fct_cmd_t, cmd, + fct_local_port_t, port, + fct_i_remote_port_t, irp, + int, (cmd->cmd_type != FCT_CMD_RCVD_ELS)); + fct_cmd_free(cmd); } diff --git a/usr/src/uts/common/io/comstar/port/fct/fct.c b/usr/src/uts/common/io/comstar/port/fct/fct.c index 0bc0285a0d..67a10b31cd 100644 --- a/usr/src/uts/common/io/comstar/port/fct/fct.c +++ b/usr/src/uts/common/io/comstar/port/fct/fct.c @@ -34,6 +34,7 @@ #include <sys/byteorder.h> #include <sys/varargs.h> #include <sys/atomic.h> +#include <sys/sdt.h> #include <stmf.h> #include <stmf_ioctl.h> @@ -871,14 +872,14 @@ fct_alloc(fct_struct_id_t struct_id, int additional_size, int flags) additional_size = (additional_size + 7) & (~7); fct_size = fct_sizes[struct_id].shared + - fct_sizes[struct_id].fw_private + - fct_sizes[struct_id].struct_specific + additional_size; + fct_sizes[struct_id].fw_private + + fct_sizes[struct_id].struct_specific + additional_size; if (struct_id == FCT_STRUCT_LOCAL_PORT) { stmf_local_port_t *lport; lport = (stmf_local_port_t *)stmf_alloc( - STMF_STRUCT_STMF_LOCAL_PORT, fct_size, flags); + STMF_STRUCT_STMF_LOCAL_PORT, fct_size, flags); if (lport) { sh = (__fct_t *)lport->lport_port_private; sh->ss = lport; @@ -889,7 +890,7 @@ fct_alloc(fct_struct_id_t struct_id, int additional_size, int flags) stmf_dbuf_store_t *ds; ds = (stmf_dbuf_store_t *)stmf_alloc(STMF_STRUCT_DBUF_STORE, - fct_size, flags); + fct_size, flags); if (ds) { sh = (__fct_t *)ds->ds_port_private; sh->ss = ds; @@ -969,7 +970,7 @@ fct_alloc_dbuf(scsi_task_t *task, uint32_t size, uint32_t *pminsize, uint32_t flags) { fct_local_port_t *port = (fct_local_port_t *) - task->task_lport->lport_port_private; + task->task_lport->lport_port_private; return (port->port_fds->fds_alloc_data_buf(port, size, pminsize, flags)); @@ -1004,7 +1005,7 @@ fct_register_local_port(fct_local_port_t *port) iport->iport_alias = iport->iport_alias_mem; } else { iport->iport_alias = - (char *)kmem_zalloc(l+1, KM_SLEEP); + (char *)kmem_zalloc(l+1, KM_SLEEP); } (void) strcpy(iport->iport_alias, port->port_default_alias); } else { @@ -1013,7 +1014,7 @@ fct_register_local_port(fct_local_port_t *port) stmf_wwn_to_devid_desc((scsi_devid_desc_t *)iport->iport_id, port->port_pwwn, PROTOCOL_FIBRE_CHANNEL); (void) snprintf(taskq_name, 24, "stmf_fct_taskq_%d", - atomic_add_32_nv(&taskq_cntr, 1)); + atomic_add_32_nv(&taskq_cntr, 1)); taskq_name[23] = 0; if ((iport->iport_worker_taskq = ddi_taskq_create(NULL, taskq_name, 1, TASKQ_DEFAULTPRI, 0)) == NULL) { @@ -1027,19 +1028,19 @@ fct_register_local_port(fct_local_port_t *port) iport->iport_rp_slots = (fct_i_remote_port_t **)kmem_zalloc( port->port_max_logins * sizeof (fct_i_remote_port_t *), KM_SLEEP); iport->iport_rp_tb = kmem_zalloc(rportid_table_size * - sizeof (fct_i_remote_port_t *), KM_SLEEP); + sizeof (fct_i_remote_port_t *), KM_SLEEP); /* fct_cmds for SCSI traffic */ iport->iport_total_alloced_ncmds = 0; iport->iport_cached_ncmds = 0; port->port_fca_fcp_cmd_size = - (port->port_fca_fcp_cmd_size + 7) & ~7; + (port->port_fca_fcp_cmd_size + 7) & ~7; iport->iport_cached_cmdlist = NULL; mutex_init(&iport->iport_cached_cmd_lock, NULL, MUTEX_DRIVER, NULL); /* Initialize cmd slots */ iport->iport_cmd_slots = (fct_cmd_slot_t *)kmem_zalloc( - port->port_max_xchges * sizeof (fct_cmd_slot_t), KM_SLEEP); + port->port_max_xchges * sizeof (fct_cmd_slot_t), KM_SLEEP); iport->iport_next_free_slot = 0; for (i = 0; i < port->port_max_xchges; ) { slot = &iport->iport_cmd_slots[i]; @@ -1050,16 +1051,16 @@ fct_register_local_port(fct_local_port_t *port) iport->iport_nslots_free = port->port_max_xchges; iport->iport_task_green_limit = - (port->port_max_xchges * FCT_TASK_GREEN_LIMIT) / 100; + (port->port_max_xchges * FCT_TASK_GREEN_LIMIT) / 100; iport->iport_task_yellow_limit = - (port->port_max_xchges * FCT_TASK_YELLOW_LIMIT) / 100; + (port->port_max_xchges * FCT_TASK_YELLOW_LIMIT) / 100; iport->iport_task_red_limit = - (port->port_max_xchges * FCT_TASK_RED_LIMIT) / 100; + (port->port_max_xchges * FCT_TASK_RED_LIMIT) / 100; /* Start worker thread */ atomic_and_32(&iport->iport_flags, ~IPORT_TERMINATE_WORKER); (void) ddi_taskq_dispatch(iport->iport_worker_taskq, - fct_port_worker, port, DDI_SLEEP); + fct_port_worker, port, DDI_SLEEP); /* Wait for taskq to start */ while ((iport->iport_flags & IPORT_WORKER_RUNNING) == 0) { delay(1); @@ -1108,7 +1109,7 @@ fct_regport_fail1:; ddi_taskq_destroy(iport->iport_worker_taskq); if (iport->iport_rp_tb) { kmem_free(iport->iport_rp_tb, rportid_table_size * - sizeof (fct_i_remote_port_t *)); + sizeof (fct_i_remote_port_t *)); } return (FCT_FAILURE); } @@ -1123,7 +1124,7 @@ fct_deregister_local_port(fct_local_port_t *port) iport = (fct_i_local_port_t *)port->port_fct_private; if ((iport->iport_state != FCT_STATE_OFFLINE) || - iport->iport_state_not_acked) { + iport->iport_state_not_acked) { return (FCT_FAILURE); } @@ -1133,14 +1134,14 @@ fct_deregister_local_port(fct_local_port_t *port) cv_broadcast(&iport->iport_worker_cv); for (ndx = 0; ndx < 100; ndx++) { if ((iport->iport_flags & IPORT_WORKER_RUNNING) - == 0) { + == 0) { break; } delay(drv_usectohz(10000)); } if (ndx == 100) { atomic_and_32(&iport->iport_flags, - ~IPORT_TERMINATE_WORKER); + ~IPORT_TERMINATE_WORKER); return (FCT_WORKER_STUCK); } } @@ -1168,16 +1169,16 @@ fct_deregister_local_port(fct_local_port_t *port) } mutex_destroy(&iport->iport_cached_cmd_lock); kmem_free(iport->iport_cmd_slots, port->port_max_xchges * - sizeof (fct_cmd_slot_t)); + sizeof (fct_cmd_slot_t)); kmem_free(iport->iport_rp_slots, port->port_max_logins * - sizeof (fct_i_remote_port_t *)); + sizeof (fct_i_remote_port_t *)); rw_destroy(&iport->iport_lock); cv_destroy(&iport->iport_worker_cv); mutex_destroy(&iport->iport_worker_lock); ddi_taskq_destroy(iport->iport_worker_taskq); if (iport->iport_rp_tb) { kmem_free(iport->iport_rp_tb, rportid_table_size * - sizeof (fct_i_remote_port_t *)); + sizeof (fct_i_remote_port_t *)); } fct_log_local_port_event(port, ESC_SUNFC_PORT_DETACH); @@ -1187,7 +1188,7 @@ fct_deregport_fail1:; /* Restart the worker */ atomic_and_32(&iport->iport_flags, ~IPORT_TERMINATE_WORKER); (void) ddi_taskq_dispatch(iport->iport_worker_taskq, - fct_port_worker, port, DDI_SLEEP); + fct_port_worker, port, DDI_SLEEP); /* Wait for taskq to start */ while ((iport->iport_flags & IPORT_WORKER_RUNNING) == 0) { delay(1); @@ -1289,7 +1290,7 @@ fct_deque_rp(fct_i_local_port_t *iport, fct_i_remote_port_t *irp) if (irp_next) { if (irp_last == NULL) { iport->iport_rp_tb[hash_key] = - irp->irp_next; + irp->irp_next; } else { irp_last->irp_next = irp->irp_next; } @@ -1400,7 +1401,7 @@ fct_rehash(fct_i_local_port_t *iport) int i; iport_rp_tb_new = kmem_zalloc(rportid_table_size * - sizeof (fct_i_remote_port_t *), KM_SLEEP); + sizeof (fct_i_remote_port_t *), KM_SLEEP); rw_enter(&iport->iport_lock, RW_WRITER); /* reconstruct the hash table */ iport_rp_tb_tmp = iport->iport_rp_tb; @@ -1416,7 +1417,7 @@ fct_rehash(fct_i_local_port_t *iport) } rw_exit(&iport->iport_lock); kmem_free(iport_rp_tb_tmp, rportid_table_size * - sizeof (fct_i_remote_port_t *)); + sizeof (fct_i_remote_port_t *)); } @@ -1449,7 +1450,7 @@ fct_scsi_task_alloc(fct_local_port_t *port, uint16_t rp_handle, fct_cmd_t *cmd; fct_i_cmd_t *icmd; fct_i_local_port_t *iport = - (fct_i_local_port_t *)port->port_fct_private; + (fct_i_local_port_t *)port->port_fct_private; fct_i_remote_port_t *irp; scsi_task_t *task; fct_remote_port_t *rp; @@ -1459,7 +1460,7 @@ fct_scsi_task_alloc(fct_local_port_t *port, uint16_t rp_handle, if ((iport->iport_link_state & S_LINK_ONLINE) == 0) { rw_exit(&iport->iport_lock); stmf_trace(iport->iport_alias, "cmd alloc called while the port" - " was offline"); + " was offline"); return (NULL); } @@ -1502,12 +1503,12 @@ fct_scsi_task_alloc(fct_local_port_t *port, uint16_t rp_handle, mutex_exit(&iport->iport_cached_cmd_lock); if (icmd == NULL) { cmd = (fct_cmd_t *)fct_alloc(FCT_STRUCT_CMD_FCP_XCHG, - port->port_fca_fcp_cmd_size, 0); + port->port_fca_fcp_cmd_size, 0); if (cmd == NULL) { rw_exit(&irp->irp_lock); rw_exit(&iport->iport_lock); stmf_trace(iport->iport_alias, "Ran out of " - "memory, port=%p", port); + "memory, port=%p", port); return (NULL); } @@ -1546,7 +1547,7 @@ fct_scsi_task_alloc(fct_local_port_t *port, uint16_t rp_handle, icmd->icmd_start_time = ddi_get_lbolt(); cmd->cmd_specific = stmf_task_alloc(port->port_lport, irp->irp_session, - lun, cdb_length, task_ext); + lun, cdb_length, task_ext); if ((task = (scsi_task_t *)cmd->cmd_specific) != NULL) { task->task_port_private = cmd; return (cmd); @@ -1572,14 +1573,20 @@ fct_post_rcvd_cmd(fct_cmd_t *cmd, stmf_data_buf_t *dbuf) if (cmd->cmd_type == FCT_CMD_FCP_XCHG) { fct_i_cmd_t *icmd = (fct_i_cmd_t *)cmd->cmd_fct_private; fct_i_local_port_t *iport = - (fct_i_local_port_t *)cmd->cmd_port->port_fct_private; + (fct_i_local_port_t *)cmd->cmd_port->port_fct_private; fct_i_remote_port_t *irp = - (fct_i_remote_port_t *)cmd->cmd_rp->rp_fct_private; + (fct_i_remote_port_t *)cmd->cmd_rp->rp_fct_private; scsi_task_t *task = (scsi_task_t *)cmd->cmd_specific; uint16_t irp_task = irp->irp_fcp_xchg_count; uint32_t load = iport->iport_total_alloced_ncmds - - iport->iport_cached_ncmds; + iport->iport_cached_ncmds; + + DTRACE_FC_4(scsi__command, + fct_cmd_t, cmd, + fct_i_local_port_t, iport, + scsi_task_t, task, + fct_i_remote_port_t, irp); if (load >= iport->iport_task_green_limit) { if ((load < iport->iport_task_yellow_limit && @@ -1589,7 +1596,7 @@ fct_post_rcvd_cmd(fct_cmd_t *cmd, stmf_data_buf_t *dbuf) irp_task >= 1) || (load >= iport->iport_task_red_limit)) task->task_additional_flags |= - TASK_AF_PORT_LOAD_HIGH; + TASK_AF_PORT_LOAD_HIGH; } stmf_post_task((scsi_task_t *)cmd->cmd_specific, dbuf); atomic_and_32(&icmd->icmd_flags, ~ICMD_IN_TRANSITION); @@ -1621,7 +1628,7 @@ fct_post_implicit_logo(fct_cmd_t *cmd) { fct_local_port_t *port = cmd->cmd_port; fct_i_local_port_t *iport = - (fct_i_local_port_t *)port->port_fct_private; + (fct_i_local_port_t *)port->port_fct_private; fct_i_cmd_t *icmd = (fct_i_cmd_t *)cmd->cmd_fct_private; fct_remote_port_t *rp = cmd->cmd_rp; fct_i_remote_port_t *irp = (fct_i_remote_port_t *)rp->rp_fct_private; @@ -1673,7 +1680,7 @@ fct_alloc_cmd_slot(fct_i_local_port_t *iport, fct_cmd_t *cmd) iport->iport_cmd_slots[cmd_slot].slot_cmd = icmd; cmd->cmd_handle = (uint32_t)cmd_slot | 0x80000000 | (((uint32_t)(iport->iport_cmd_slots[cmd_slot].slot_uniq_cntr)) - << 24); + << 24); return (cmd_slot); } @@ -1690,7 +1697,8 @@ fct_post_to_discovery_queue(fct_i_local_port_t *iport, if (icmd) { icmd->icmd_next = NULL; for (p = &irp->irp_els_list; *p != NULL; - p = &((*p)->icmd_next)); + p = &((*p)->icmd_next)) + ; *p = icmd; atomic_or_32(&icmd->icmd_flags, ICMD_IN_IRP_QUEUE); } @@ -1728,6 +1736,13 @@ fct_xfer_scsi_data(scsi_task_t *task, stmf_data_buf_t *dbuf, uint32_t ioflags) { fct_cmd_t *cmd = (fct_cmd_t *)task->task_port_private; + DTRACE_FC_5(xfer__start, + fct_cmd_t, cmd, + fct_i_local_port_t, cmd->cmd_port->port_fct_private, + scsi_task_t, task, + fct_i_remote_port_t, cmd->cmd_rp->rp_fct_private, + stmf_data_buf_t, dbuf); + return (cmd->cmd_port->port_xfer_scsi_data(cmd, dbuf, ioflags)); } @@ -1738,6 +1753,13 @@ fct_scsi_data_xfer_done(fct_cmd_t *cmd, stmf_data_buf_t *dbuf, uint32_t ioflags) uint32_t old, new; uint32_t iof = 0; + DTRACE_FC_5(xfer__done, + fct_cmd_t, cmd, + fct_i_local_port_t, cmd->cmd_port->port_fct_private, + scsi_task_t, ((scsi_task_t *)cmd->cmd_specific), + fct_i_remote_port_t, cmd->cmd_rp->rp_fct_private, + stmf_data_buf_t, dbuf); + if (ioflags & FCT_IOF_FCA_DONE) { do { old = new = icmd->icmd_flags; @@ -1760,6 +1782,14 @@ fct_send_scsi_status(scsi_task_t *task, uint32_t ioflags) { fct_cmd_t *cmd = (fct_cmd_t *)task->task_port_private; + DTRACE_FC_4(scsi__response, + fct_cmd_t, cmd, + fct_i_local_port_t, + (fct_i_local_port_t *)cmd->cmd_port->port_fct_private, + scsi_task_t, task, + fct_i_remote_port_t, + (fct_i_remote_port_t *)cmd->cmd_rp->rp_fct_private); + return (cmd->cmd_port->port_send_cmd_response(cmd, ioflags)); } @@ -1769,7 +1799,7 @@ fct_send_response_done(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags) fct_i_cmd_t *icmd = (fct_i_cmd_t *)cmd->cmd_fct_private; fct_local_port_t *port = cmd->cmd_port; fct_i_local_port_t *iport = (fct_i_local_port_t *) - port->port_fct_private; + port->port_fct_private; uint32_t old, new; if ((ioflags & FCT_IOF_FCA_DONE) == 0) { @@ -1788,7 +1818,7 @@ fct_send_response_done(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags) cmd->cmd_comp_status = s; if (cmd->cmd_type == FCT_CMD_FCP_XCHG) { stmf_send_status_done((scsi_task_t *)cmd->cmd_specific, s, - STMF_IOF_LPORT_DONE); + STMF_IOF_LPORT_DONE); return; } @@ -1855,7 +1885,7 @@ fct_cmd_free(fct_cmd_t *cmd) atomic_add_16(&iport->iport_nslots_free, 1); if (cmd->cmd_rp) { irp = (fct_i_remote_port_t *) - cmd->cmd_rp->rp_fct_private; + cmd->cmd_rp->rp_fct_private; if (cmd->cmd_type == FCT_CMD_FCP_XCHG) atomic_add_16(&irp->irp_fcp_xchg_count, -1); else @@ -1867,7 +1897,7 @@ fct_cmd_free(fct_cmd_t *cmd) /* for implicit cmd, no cmd slot is used */ if (cmd->cmd_rp) { irp = (fct_i_remote_port_t *) - cmd->cmd_rp->rp_fct_private; + cmd->cmd_rp->rp_fct_private; if (cmd->cmd_type == FCT_CMD_FCP_XCHG) atomic_add_16(&irp->irp_fcp_xchg_count, -1); else @@ -2396,7 +2426,7 @@ fct_create_solct(fct_local_port_t *port, fct_remote_port_t *query_rp, ct->ct_resp_payload = (uint8_t *)kmem_zalloc(ct->ct_resp_size, KM_SLEEP); ct->ct_req_size = ct->ct_req_alloc_size = - (21 + namelen + 3) & ~3; + (21 + namelen + 3) & ~3; p = ct->ct_req_payload = (uint8_t *)kmem_zalloc(ct->ct_req_size, KM_SLEEP); @@ -2631,7 +2661,7 @@ fct_handle_to_cmd(fct_local_port_t *port, uint32_t fct_handle) return (NULL); slot = &((fct_i_local_port_t *)port->port_fct_private)->iport_cmd_slots[ - ndx]; + ndx]; if ((slot->slot_uniq_cntr | 0x80) != (fct_handle >> 24)) return (NULL); @@ -2653,7 +2683,7 @@ fct_queue_scsi_task_for_termination(fct_cmd_t *cmd, fct_status_t s) new = old | ICMD_BEING_ABORTED; } while (atomic_cas_32(&icmd->icmd_flags, old, new) != old); stmf_abort(STMF_QUEUE_TASK_ABORT, (scsi_task_t *)cmd->cmd_specific, - s, NULL); + s, NULL); } void @@ -2785,7 +2815,7 @@ fct_queue_cmd_for_termination(fct_cmd_t *cmd, fct_status_t s) { fct_local_port_t *port = cmd->cmd_port; fct_i_local_port_t *iport = (fct_i_local_port_t *) - port->port_fct_private; + port->port_fct_private; fct_i_cmd_t *icmd = (fct_i_cmd_t *)cmd->cmd_fct_private; if (cmd->cmd_type == FCT_CMD_FCP_XCHG) { @@ -2821,7 +2851,8 @@ fct_q_for_termination_lock_held(fct_i_local_port_t *iport, fct_i_cmd_t *icmd, icmd->icmd_next = NULL; for (ppicmd = &(iport->iport_abort_queue); *ppicmd != NULL; - ppicmd = &((*ppicmd)->icmd_next)); + ppicmd = &((*ppicmd)->icmd_next)) + ; *ppicmd = icmd; } @@ -2950,7 +2981,7 @@ fct_handle_port_offline(fct_i_local_port_t *iport) iport->iport_state = FCT_STATE_OFFLINE; mutex_exit(&iport->iport_worker_lock); (void) stmf_ctl(STMF_CMD_LPORT_OFFLINE_COMPLETE, - iport->iport_port->port_lport, &st); + iport->iport_port->port_lport, &st); mutex_enter(&iport->iport_worker_lock); return (DISC_ACTION_DELAY_RESCAN); } @@ -3066,12 +3097,12 @@ fct_cmd_terminator(fct_i_local_port_t *iport) return (DISC_ACTION_DELAY_RESCAN); } atomic_and_32(&icmd->icmd_flags, - ~ICMD_FCA_ABORT_CALLED); + ~ICMD_FCA_ABORT_CALLED); } else if ((flags & FCT_IOF_FORCE_FCA_DONE) || (abort_ret == FCT_ABORT_SUCCESS) || (abort_ret == FCT_NOT_FOUND)) { atomic_and_32(&icmd->icmd_flags, - ~ICMD_KNOWN_TO_FCA); + ~ICMD_KNOWN_TO_FCA); } ret |= DISC_ACTION_DELAY_RESCAN; } else if (icmd->icmd_flags & ICMD_IMPLICIT) { @@ -3297,3 +3328,17 @@ fct_value_to_netbuf(uint64_t value, uint8_t *buf, uint8_t nbytes) buf[idx] = 0xFF & (value >> (8 * (nbytes - idx - 1))); } } + +/* + * from_ptr: ptr to uchar_t array of size WWN_SIZE + * to_ptr: char ptr to string of size WWN_SIZE*2+1 + */ +void +fct_wwn_to_str(char *to_ptr, const uint8_t *from_ptr) +{ + ASSERT(to_ptr != NULL && from_ptr != NULL); + + (void) sprintf(to_ptr, "%02x%02x%02x%02x%02x%02x%02x%02x", + from_ptr[0], from_ptr[1], from_ptr[2], from_ptr[3], + from_ptr[4], from_ptr[5], from_ptr[6], from_ptr[7]); +} diff --git a/usr/src/uts/common/io/comstar/port/qlt/qlt.c b/usr/src/uts/common/io/comstar/port/qlt/qlt.c index 37a6fa31c1..17b8dcb1df 100644 --- a/usr/src/uts/common/io/comstar/port/qlt/qlt.c +++ b/usr/src/uts/common/io/comstar/port/qlt/qlt.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -220,7 +220,7 @@ _init(void) if (ret == 0) { mutex_init(&qlt_global_lock, 0, MUTEX_DRIVER, 0); qlt_pp = (stmf_port_provider_t *)stmf_alloc( - STMF_STRUCT_PORT_PROVIDER, 0, 0); + STMF_STRUCT_PORT_PROVIDER, 0, 0); qlt_pp->pp_portif_rev = PORTIF_REV_1; qlt_pp->pp_name = qlt_provider_name; if (stmf_register_port_provider(qlt_pp) != STMF_SUCCESS) { @@ -295,7 +295,7 @@ qlt_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) } if ((qlt = (qlt_state_t *)ddi_get_soft_state(qlt_state, instance)) - == NULL) { + == NULL) { goto attach_fail_1; } qlt->instance = instance; @@ -373,12 +373,12 @@ qlt_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) goto attach_fail_8; (void) snprintf(qlt->qlt_minor_name, sizeof (qlt->qlt_minor_name), - "qlt%d", instance); + "qlt%d", instance); (void) snprintf(qlt->qlt_port_alias, sizeof (qlt->qlt_port_alias), "%s,0", qlt->qlt_minor_name); if (ddi_create_minor_node(dip, qlt->qlt_minor_name, S_IFCHR, - instance, DDI_NT_STMF_PP, 0) != DDI_SUCCESS) { + instance, DDI_NT_STMF_PP, 0) != DDI_SUCCESS) { goto attach_fail_9; } @@ -426,7 +426,7 @@ qlt_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) cmn_err(CE_WARN, "qlt(%d) malformed " "pci-max-read-request in qlt.conf. Valid values " "for this HBA are 128/256/512/1024/2048/4096", - instance); + instance); goto over_max_read_xfer_setting; } mr = PCICFG_RD16(qlt, 0x54); @@ -456,7 +456,7 @@ over_max_read_xfer_setting:; cmn_err(CE_WARN, "qlt(%d) malformed " "pcie-max-payload-size in qlt.conf. Valid values " "for this HBA are 128/256/512/1024", - instance); + instance); goto over_max_payload_setting; } mr = PCICFG_RD16(qlt, 0x54); @@ -514,7 +514,7 @@ qlt_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) instance = ddi_get_instance(dip); if ((qlt = (qlt_state_t *)ddi_get_soft_state(qlt_state, instance)) - == NULL) { + == NULL) { return (DDI_FAILURE); } @@ -523,7 +523,7 @@ qlt_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) } if ((qlt->qlt_state != FCT_STATE_OFFLINE) || - qlt->qlt_state_not_acked) { + qlt->qlt_state_not_acked) { return (DDI_FAILURE); } if (qlt_port_stop((caddr_t)qlt) != FCT_SUCCESS) @@ -861,13 +861,14 @@ qlt_populate_hba_fru_details(struct fct_local_port *port, kmem_free(bufp, len); bufp = NULL; } else { - (void) snprintf(port_attrs->option_rom_version, - FCHBA_OPTION_ROM_VERSION_LEN, "%s", #ifdef __sparc - "No Fcode found"); +#define FCHBA_OPTION_ROM_ERR_TEXT "No Fcode found" #else - "N/A"); +#define FCHBA_OPTION_ROM_ERR_TEXT "N/A" #endif + (void) snprintf(port_attrs->option_rom_version, + FCHBA_OPTION_ROM_VERSION_LEN, "%s", + FCHBA_OPTION_ROM_ERR_TEXT); } port_attrs->vendor_specific_id = qlt->nvram->subsystem_vendor_id[0] | qlt->nvram->subsystem_vendor_id[1] << 8; @@ -918,6 +919,8 @@ qlt_port_start(caddr_t arg) port->port_fca_abort_timeout = 5 * 1000; /* 5 seconds */ bcopy(qlt->nvram->node_name, port->port_nwwn, 8); bcopy(qlt->nvram->port_name, port->port_pwwn, 8); + fct_wwn_to_str(port->port_nwwn_str, port->port_nwwn); + fct_wwn_to_str(port->port_pwwn_str, port->port_pwwn); port->port_default_alias = qlt->qlt_port_alias; port->port_pp = qlt_pp; port->port_fds = fds; @@ -1044,7 +1047,7 @@ qlt_port_online(qlt_state_t *qlt) SETELSBIT(elsbmp, ELS_OP_RSCN); SETELSBIT(elsbmp, ELS_OP_RNID); (void) ddi_dma_sync(qlt->queue_mem_dma_handle, MBOX_DMA_MEM_OFFSET, 32, - DDI_DMA_SYNC_FORDEV); + DDI_DMA_SYNC_FORDEV); ret = qlt_raw_mailbox_command(qlt); REG_WR32(qlt, REG_HCCR, HCCR_CMD_CLEAR_RISC_TO_PCI_INTR); if (ret != QLT_SUCCESS) { @@ -1099,7 +1102,7 @@ qlt_port_online(qlt_state_t *qlt) DMEM_WR16(qlt, icb+0x58, 2); /* Interrupt delay Timer */ DMEM_WR16(qlt, icb+0x5a, 4); /* Login timeout (secs) */ DMEM_WR32(qlt, icb+0x5c, BIT_11 | BIT_5 | BIT_4 | - BIT_2 | BIT_1 | BIT_0); + BIT_2 | BIT_1 | BIT_0); DMEM_WR32(qlt, icb+0x60, BIT_5); DMEM_WR32(qlt, icb+0x64, BIT_14 | BIT_8 | BIT_7 | BIT_4); qlt_dmem_dma_sync(mcp->dbuf, DDI_DMA_SYNC_FORDEV); @@ -1149,7 +1152,7 @@ qlt_port_offline(qlt_state_t *qlt) /* Wait to grab the mailboxes */ for (retries = 0; qlt->mbox_io_state != MBOX_STATE_READY; - retries++) { + retries++) { cv_wait(&qlt->mbox_cv, &qlt->mbox_lock); if ((retries > 5) || (qlt->mbox_io_state == MBOX_STATE_UNKNOWN)) { @@ -1203,7 +1206,7 @@ link_info_retry: fc_ret = FCT_FAILURE; } else { li->portid = ((uint32_t)(mcp->from_fw[2])) | - (((uint32_t)(mcp->from_fw[3])) << 16); + (((uint32_t)(mcp->from_fw[3])) << 16); li->port_speed = qlt->link_speed; switch (mcp->from_fw[6]) { @@ -1459,7 +1462,7 @@ qlt_ioctl(dev_t dev, int cmd, intptr_t data, int mode, } qlt->fw_length01 = intp[3]; qlt->fw_code01 = (uint32_t *)kmem_alloc(iocd->stmf_ibuf_size, - KM_SLEEP); + KM_SLEEP); bcopy(intp, qlt->fw_code01, iocd->stmf_ibuf_size); qlt->fw_addr01 = intp[2]; qlt->fw_code02 = &qlt->fw_code01[intp[3]]; @@ -1698,8 +1701,8 @@ qlt_get_req_entries(qlt_state_t *qlt, uint32_t n) qlt->req_ndx_from_fw = val1; qlt->req_available = REQUEST_QUEUE_ENTRIES - 1 - - ((qlt->req_ndx_to_fw - qlt->req_ndx_from_fw) & - (REQUEST_QUEUE_ENTRIES - 1)); + ((qlt->req_ndx_to_fw - qlt->req_ndx_from_fw) & + (REQUEST_QUEUE_ENTRIES - 1)); if (qlt->req_available < n) { if (try < 2) { drv_usecwait(100); @@ -1743,8 +1746,8 @@ qlt_get_preq_entries(qlt_state_t *qlt, uint32_t n) { int try = 0; uint32_t req_available = PRIORITY_QUEUE_ENTRIES - 1 - - ((qlt->preq_ndx_to_fw - qlt->preq_ndx_from_fw) & - (PRIORITY_QUEUE_ENTRIES - 1)); + ((qlt->preq_ndx_to_fw - qlt->preq_ndx_from_fw) & + (PRIORITY_QUEUE_ENTRIES - 1)); while (req_available < n) { uint32_t val1, val2, val3; @@ -1756,8 +1759,8 @@ qlt_get_preq_entries(qlt_state_t *qlt, uint32_t n) qlt->preq_ndx_from_fw = val1; req_available = PRIORITY_QUEUE_ENTRIES - 1 - - ((qlt->preq_ndx_to_fw - qlt->preq_ndx_from_fw) & - (PRIORITY_QUEUE_ENTRIES - 1)); + ((qlt->preq_ndx_to_fw - qlt->preq_ndx_from_fw) & + (PRIORITY_QUEUE_ENTRIES - 1)); if (req_available < n) { if (try < 2) { drv_usecwait(100); @@ -1825,7 +1828,7 @@ qlt_reset_chip_and_download_fw(qlt_state_t *qlt, int reset_only) /* Reset the Chip */ REG_WR32(qlt, REG_CTRL_STATUS, - DMA_SHUTDOWN_CTRL | PCI_X_XFER_CTRL | CHIP_SOFT_RESET); + DMA_SHUTDOWN_CTRL | PCI_X_XFER_CTRL | CHIP_SOFT_RESET); qlt->qlt_link_up = 0; @@ -1848,7 +1851,7 @@ qlt_reset_chip_and_download_fw(qlt_state_t *qlt, int reset_only) /* Load the two segments */ if (qlt->fw_code01 != NULL) { ret = qlt_load_risc_ram(qlt, qlt->fw_code01, qlt->fw_length01, - qlt->fw_addr01); + qlt->fw_addr01); if (ret == QLT_SUCCESS) { ret = qlt_load_risc_ram(qlt, qlt->fw_code02, qlt->fw_length02, qlt->fw_addr02); @@ -1856,18 +1859,18 @@ qlt_reset_chip_and_download_fw(qlt_state_t *qlt, int reset_only) start_addr = qlt->fw_addr01; } else if (qlt->qlt_25xx_chip) { ret = qlt_load_risc_ram(qlt, fw2500_code01, fw2500_length01, - fw2500_addr01); + fw2500_addr01); if (ret == QLT_SUCCESS) { ret = qlt_load_risc_ram(qlt, fw2500_code02, - fw2500_length02, fw2500_addr02); + fw2500_length02, fw2500_addr02); } start_addr = fw2500_addr01; } else { ret = qlt_load_risc_ram(qlt, fw2400_code01, fw2400_length01, - fw2400_addr01); + fw2400_addr01); if (ret == QLT_SUCCESS) { ret = qlt_load_risc_ram(qlt, fw2400_code02, - fw2400_length02, fw2400_addr02); + fw2400_length02, fw2400_addr02); } start_addr = fw2400_addr01; } @@ -1928,12 +1931,12 @@ qlt_load_risc_ram(qlt_state_t *qlt, uint32_t *host_addr, cur_host_addr = &(host_addr[words_sent]); cur_risc_addr = risc_addr + (words_sent << 2); words_being_sent = min(word_count - words_sent, - TOTAL_DMA_MEM_SIZE >> 2); + TOTAL_DMA_MEM_SIZE >> 2); ddi_rep_put32(qlt->queue_mem_acc_handle, cur_host_addr, (uint32_t *)qlt->queue_mem_ptr, words_being_sent, DDI_DEV_AUTOINCR); (void) ddi_dma_sync(qlt->queue_mem_dma_handle, 0, - words_being_sent << 2, DDI_DMA_SYNC_FORDEV); + words_being_sent << 2, DDI_DMA_SYNC_FORDEV); da = qlt->queue_mem_cookie.dmac_laddress; REG_WR16(qlt, REG_MBOX(0), 0x0B); REG_WR16(qlt, REG_MBOX(1), risc_addr & 0xffff); @@ -2061,7 +2064,7 @@ qlt_mailbox_command(qlt_state_t *qlt, mbox_cmd_t *mcp) /* Wait to grab the mailboxes */ for (retries = 0; qlt->mbox_io_state != MBOX_STATE_READY; - retries++) { + retries++) { cv_wait(&qlt->mbox_cv, &qlt->mbox_lock); if ((retries > 5) || (qlt->mbox_io_state == MBOX_STATE_UNKNOWN)) { @@ -2222,7 +2225,7 @@ intr_again:; } else if (code == 0x8012) { qlt->qlt_link_up = 0; fct_handle_event(qlt->qlt_port, FCT_EVENT_LINK_DOWN, - 0, 0); + 0, 0); } else if (code == 0x8011) { switch (mbox1) { case 0: qlt->link_speed = PORT_SPEED_1G; @@ -2238,7 +2241,7 @@ intr_again:; } qlt->qlt_link_up = 1; fct_handle_event(qlt->qlt_port, FCT_EVENT_LINK_UP, - 0, 0); + 0, 0); } else if (code == 0x8002) { (void) snprintf(info, 80, "Got 8002, mb1=%x mb2=%x mb5=%x mb6=%x", @@ -2254,13 +2257,13 @@ intr_again:; if (qlt->mbox_io_state != MBOX_STATE_CMD_RUNNING) { cmn_err(CE_WARN, "qlt(%d): mailbox completion received" " when driver wasn't waiting for it %d", - instance, qlt->mbox_io_state); + instance, qlt->mbox_io_state); } else { for (i = 0; i < MAX_MBOXES; i++) { if (qlt->mcp->from_fw_mask & (((uint32_t)1) << i)) { qlt->mcp->from_fw[i] = - REG_RD16(qlt, REG_MBOX(i)); + REG_RD16(qlt, REG_MBOX(i)); } } qlt->mbox_io_state = MBOX_STATE_CMD_DONE; @@ -2329,10 +2332,10 @@ qlt_read_nvram(qlt_state_t *qlt) if (qlt->qlt_25xx_chip) { addr = REG_RD32(qlt, REG_CTRL_STATUS) & FUNCTION_NUMBER ? - QLT25_NVRAM_FUNC1_ADDR : QLT25_NVRAM_FUNC0_ADDR; + QLT25_NVRAM_FUNC1_ADDR : QLT25_NVRAM_FUNC0_ADDR; } else { addr = REG_RD32(qlt, REG_CTRL_STATUS) & FUNCTION_NUMBER ? - NVRAM_FUNC1_ADDR : NVRAM_FUNC0_ADDR; + NVRAM_FUNC1_ADDR : NVRAM_FUNC0_ADDR; } mutex_enter(&qlt_global_lock); @@ -2390,7 +2393,7 @@ qlt_sync_atio_queue(qlt_state_t *qlt) DDI_DMA_SYNC_FORCPU); } else { total_ent = ATIO_QUEUE_ENTRIES - qlt->atio_ndx_to_fw + - qlt->atio_ndx_from_fw; + qlt->atio_ndx_from_fw; (void) ddi_dma_sync(qlt->queue_mem_dma_handle, ATIO_QUEUE_OFFSET + (qlt->atio_ndx_to_fw << 6), (ATIO_QUEUE_ENTRIES - qlt->atio_ndx_to_fw) << 6, DDI_DMA_SYNC_FORCPU); @@ -2413,7 +2416,7 @@ qlt_handle_atio_queue_update(qlt_state_t *qlt) do { uint8_t *atio = (uint8_t *)&qlt->atio_ptr[ - qlt->atio_ndx_to_fw << 6]; + qlt->atio_ndx_to_fw << 6]; uint32_t ent_cnt; ent_cnt = (uint32_t)(atio[1]); @@ -2433,7 +2436,7 @@ qlt_handle_atio_queue_update(qlt_state_t *qlt) break; } qlt->atio_ndx_to_fw = (qlt->atio_ndx_to_fw + ent_cnt) & - (ATIO_QUEUE_ENTRIES - 1); + (ATIO_QUEUE_ENTRIES - 1); total_ent -= ent_cnt; } while (total_ent > 0); REG_WR32(qlt, REG_ATIO_OUT_PTR, qlt->atio_ndx_to_fw); @@ -2452,7 +2455,7 @@ qlt_sync_resp_queue(qlt_state_t *qlt) DDI_DMA_SYNC_FORCPU); } else { total_ent = RESPONSE_QUEUE_ENTRIES - qlt->resp_ndx_to_fw + - qlt->resp_ndx_from_fw; + qlt->resp_ndx_from_fw; (void) ddi_dma_sync(qlt->queue_mem_dma_handle, RESPONSE_QUEUE_OFFSET + (qlt->resp_ndx_to_fw << 6), (RESPONSE_QUEUE_ENTRIES - @@ -2523,7 +2526,7 @@ qlt_handle_resp_queue_update(qlt_state_t *qlt) break; } qlt->resp_ndx_to_fw = (qlt->resp_ndx_to_fw + ent_cnt) & - (RESPONSE_QUEUE_ENTRIES - 1); + (RESPONSE_QUEUE_ENTRIES - 1); total_ent -= ent_cnt; } while (total_ent > 0); REG_WR32(qlt, REG_RESP_OUT_PTR, qlt->resp_ndx_to_fw); @@ -2571,7 +2574,7 @@ qlt_portid_to_handle(qlt_state_t *qlt, uint32_t id, uint16_t cmd_handle, cmn_err(CE_WARN, "login for portid %x came in " "with handle %x, while the portid was " "already using a different handle %x", - id, cmd_handle, h); + id, cmd_handle, h); qlt_free_mailbox_command(qlt, mcp); return (QLT_FAILURE); } @@ -2642,8 +2645,8 @@ qlt_register_remote_port(fct_local_port_t *port, fct_remote_port_t *rp, case 0xFFFFFF: h = 0x7FF; break; default: ret = qlt_portid_to_handle( - (qlt_state_t *)port->port_fca_private, rp->rp_id, - login->cmd_rp_handle, &h); + (qlt_state_t *)port->port_fca_private, rp->rp_id, + login->cmd_rp_handle, &h); if (ret != FCT_SUCCESS) return (ret); } @@ -3058,7 +3061,7 @@ qlt_send_status(qlt_state_t *qlt, fct_cmd_t *cmd) mutex_exit(&qlt->req_lock); if (use_mode2) { qlt_dmem_free(cmd->cmd_port->port_fds, - qcmd->dbuf_rsp_iu); + qcmd->dbuf_rsp_iu); qcmd->dbuf_rsp_iu = NULL; } return (FCT_BUSY); @@ -3399,7 +3402,7 @@ qlt_handle_atio(qlt_state_t *qlt, uint8_t *atio) if (q == ((uint8_t *)qlt->queue_mem_ptr + ATIO_QUEUE_OFFSET + (ATIO_QUEUE_ENTRIES * 64))) { q = (uint8_t *)qlt->queue_mem_ptr + - ATIO_QUEUE_OFFSET; + ATIO_QUEUE_OFFSET; } } for (i = 0; i < 4; i++) { @@ -3407,16 +3410,16 @@ qlt_handle_atio(qlt_state_t *qlt, uint8_t *atio) if (q == ((uint8_t *)qlt->queue_mem_ptr + ATIO_QUEUE_OFFSET + (ATIO_QUEUE_ENTRIES * 64))) { q = (uint8_t *)qlt->queue_mem_ptr + - ATIO_QUEUE_OFFSET; + ATIO_QUEUE_OFFSET; } } task->task_expected_xfer_length = (((uint32_t)cb[0]) << 24) | - (((uint32_t)cb[1]) << 16) | - (((uint32_t)cb[2]) << 8) | cb[3]; + (((uint32_t)cb[1]) << 16) | + (((uint32_t)cb[2]) << 8) | cb[3]; } else { task->task_expected_xfer_length = (((uint32_t)q[0]) << 24) | - (((uint32_t)q[1]) << 16) | - (((uint32_t)q[2]) << 8) | q[3]; + (((uint32_t)q[1]) << 16) | + (((uint32_t)q[2]) << 8) | q[3]; } fct_post_rcvd_cmd(cmd, 0); } @@ -3683,7 +3686,7 @@ qlt_handle_sol_els_completion(qlt_state_t *qlt, uint8_t *rsp) qlt_dmem_dma_sync(qcmd->dbuf, DDI_DMA_SYNC_FORKERNEL); bcopy(qcmd->dbuf->db_sglist[0].seg_addr + qcmd->param.resp_offset, - els->els_resp_payload, els->els_resp_size); + els->els_resp_payload, els->els_resp_size); } qlt_dmem_free(NULL, qcmd->dbuf); qcmd->dbuf = NULL; @@ -4207,7 +4210,7 @@ qlt_send_els(qlt_state_t *qlt, fct_cmd_t *cmd) qcmd->dbuf = buf; bcopy(els->els_req_payload, buf->db_sglist[0].seg_addr, - els->els_req_size); + els->els_req_size); qlt_dmem_dma_sync(buf, DDI_DMA_SYNC_FORDEV); mutex_enter(&qlt->req_lock); @@ -4236,7 +4239,7 @@ qlt_send_els(qlt_state_t *qlt, fct_cmd_t *cmd) QMEM_WR64(qlt, (&req[0x28]), bctl->bctl_dev_addr); QMEM_WR32(qlt, (&req[0x30]), els->els_req_size); QMEM_WR64(qlt, (&req[0x34]), bctl->bctl_dev_addr + - qcmd->param.resp_offset); + qcmd->param.resp_offset); QMEM_WR32(qlt, (&req[0x3C]), els->els_resp_size); qlt_submit_req_entries(qlt, 1); mutex_exit(&qlt->req_lock); @@ -4267,7 +4270,7 @@ qlt_send_ct(qlt_state_t *qlt, fct_cmd_t *cmd) qcmd->dbuf = buf; bcopy(ct->ct_req_payload, buf->db_sglist[0].seg_addr, - ct->ct_req_size); + ct->ct_req_size); qlt_dmem_dma_sync(buf, DDI_DMA_SYNC_FORDEV); mutex_enter(&qlt->req_lock); @@ -4657,7 +4660,7 @@ over_aseq_regs:; * Queues */ n = snprintf(buf, size_left, - "\nRequest0 Queue DMA Channel registers\n"); + "\nRequest0 Queue DMA Channel registers\n"); buf += n; size_left -= n; REG_WR32(qlt, 0x54, 0x7200); n = qlt_fwdump_dump_regs(qlt, buf, 0xc0, 8, size_left); @@ -4666,7 +4669,7 @@ over_aseq_regs:; buf += n; size_left -= n; n = snprintf(buf, size_left, - "\n\nResponse0 Queue DMA Channel registers\n"); + "\n\nResponse0 Queue DMA Channel registers\n"); buf += n; size_left -= n; REG_WR32(qlt, 0x54, 0x7300); n = qlt_fwdump_dump_regs(qlt, buf, 0xc0, 8, size_left); @@ -4675,7 +4678,7 @@ over_aseq_regs:; buf += n; size_left -= n; n = snprintf(buf, size_left, - "\n\nRequest1 Queue DMA Channel registers\n"); + "\n\nRequest1 Queue DMA Channel registers\n"); buf += n; size_left -= n; REG_WR32(qlt, 0x54, 0x7400); n = qlt_fwdump_dump_regs(qlt, buf, 0xc0, 8, size_left); @@ -5020,7 +5023,7 @@ dump_ok: mutex_enter(&qlt->qlt_ioctl_lock); qlt->qlt_ioctl_flags &= - ~(QLT_FWDUMP_INPROGRESS | QLT_FWDUMP_FETCHED_BY_USER); + ~(QLT_FWDUMP_INPROGRESS | QLT_FWDUMP_FETCHED_BY_USER); qlt->qlt_ioctl_flags |= QLT_FWDUMP_ISVALID; mutex_exit(&qlt->qlt_ioctl_lock); return (FCT_SUCCESS); @@ -5065,7 +5068,7 @@ qlt_dump_risc_ram(qlt_state_t *qlt, uint32_t addr, uint32_t words, for (i = 0, n = 0; i < words; i++) { if ((i & 7) == 0) { n += snprintf(&buf[n], (size_left - n), "%08x: ", - addr + i); + addr + i); } if ((i + 1) & 7) { c = ' '; diff --git a/usr/src/uts/common/sys/fct.h b/usr/src/uts/common/sys/fct.h index 514535afba..43940a90d2 100644 --- a/usr/src/uts/common/sys/fct.h +++ b/usr/src/uts/common/sys/fct.h @@ -55,6 +55,8 @@ typedef struct fct_remote_port { void *rp_fca_private; struct fct_local_port *rp_port; + char rp_nwwn_str[FC_WWN_BUFLEN]; + char rp_pwwn_str[FC_WWN_BUFLEN]; uint8_t rp_nwwn[FC_WWN_LEN]; uint8_t rp_pwwn[FC_WWN_LEN]; uint32_t rp_id; /* 8 or 24 bit */ @@ -188,6 +190,8 @@ typedef struct fct_local_port { void *port_fca_private; stmf_local_port_t *port_lport; + char port_nwwn_str[FC_WWN_BUFLEN]; + char port_pwwn_str[FC_WWN_BUFLEN]; uint8_t port_nwwn[FC_WWN_LEN]; uint8_t port_pwwn[FC_WWN_LEN]; char *port_default_alias; @@ -372,6 +376,7 @@ fct_status_t fct_handle_rcvd_flogi(fct_local_port_t *port, void fct_log_local_port_event(fct_local_port_t *port, char *subclass); void fct_log_remote_port_event(fct_local_port_t *port, char *subclass, uint8_t *rp_pwwn, uint32_t rp_id); +void fct_wwn_to_str(char *to_ptr, const uint8_t *from_ptr); #ifdef __cplusplus } diff --git a/usr/src/uts/common/sys/fct_defines.h b/usr/src/uts/common/sys/fct_defines.h index 9eec28a6f1..cd4f8324c5 100644 --- a/usr/src/uts/common/sys/fct_defines.h +++ b/usr/src/uts/common/sys/fct_defines.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _FCT_DEFINES_H @@ -206,6 +206,11 @@ typedef stmf_status_t fct_status_t; (((x) >= NPORT_ID_DOM_CTLR_START) && ((x) <= NPORT_ID_DOM_CTLR_END))) #define FC_WWN_LEN 8 +/* + * NB: FC_WWN_BUFLEN should be 64-bit aligned (divisible by 8). + */ +#define FC_WWN_BUFLEN (FC_WWN_LEN * 3) +#define FC_WWN_STRLEN (FC_WWN_BUFLEN - 1) /* add trailing null */ struct fct_cmd; struct fct_local_port; diff --git a/usr/src/uts/common/sys/sdt.h b/usr/src/uts/common/sys/sdt.h index ff04802196..d13ceee3d7 100644 --- a/usr/src/uts/common/sys/sdt.h +++ b/usr/src/uts/common/sys/sdt.h @@ -19,15 +19,13 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SYS_SDT_H #define _SYS_SDT_H -#pragma ident "%Z%%M% %I% %E% SMI" - #ifdef __cplusplus extern "C" { #endif @@ -259,6 +257,26 @@ extern "C" { DTRACE_PROBE4(__xpv_##name, type1, arg1, type2, arg2, \ type3, arg3, type4, arg4); +#define DTRACE_FC_1(name, type1, arg1) \ + DTRACE_PROBE1(__fc_##name, type1, arg1); + +#define DTRACE_FC_2(name, type1, arg1, type2, arg2) \ + DTRACE_PROBE2(__fc_##name, type1, arg1, type2, arg2); + +#define DTRACE_FC_3(name, type1, arg1, type2, arg2, type3, arg3) \ + DTRACE_PROBE3(__fc_##name, type1, arg1, type2, arg2, type3, arg3); + +#define DTRACE_FC_4(name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \ + DTRACE_PROBE4(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4); + +#define DTRACE_FC_5(name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5) \ + DTRACE_PROBE5(__fc_##name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5); + + + #endif /* _KERNEL */ extern const char *sdt_prefix; |