Print this page
NEX-5979 QLogic 2322 flash bug
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Marcel Telka <marcel.telka@nexenta.com>
NEX-5717 import QLogic 16G FC drivers
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>

@@ -17,29 +17,29 @@
  * information: Portions Copyright [yyyy] [name of copyright owner]
  *
  * CDDL HEADER END
  */
 
-/* Copyright 2010 QLogic Corporation */
+/* Copyright 2015 QLogic Corporation */
 
 /*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  */
 
-#pragma ident   "Copyright 2010 QLogic Corporation; ql_xioctl.c"
+#pragma ident   "Copyright 2015 QLogic Corporation; ql_xioctl.c"
 
 /*
  * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file.
  *
  * ***********************************************************************
  * *                                                                    **
  * *                            NOTICE                                  **
- * *            COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION              **
+ * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  * *                    ALL RIGHTS RESERVED                             **
  * *                                                                    **
  * ***********************************************************************
  *
  */

@@ -49,10 +49,11 @@
 #include <ql_debug.h>
 #include <ql_init.h>
 #include <ql_iocb.h>
 #include <ql_ioctl.h>
 #include <ql_mbx.h>
+#include <ql_nx.h>
 #include <ql_xioctl.h>
 
 /*
  * Local data
  */

@@ -94,11 +95,11 @@
 
 static int ql_lun_count(ql_adapter_state_t *, ql_tgt_t *);
 static int ql_report_lun(ql_adapter_state_t *, ql_tgt_t *);
 static int ql_inq_scan(ql_adapter_state_t *, ql_tgt_t *, int);
 static int ql_inq(ql_adapter_state_t *, ql_tgt_t *, int, ql_mbx_iocb_t *,
-    uint8_t);
+    uint32_t);
 static uint32_t ql_get_buffer_data(caddr_t, caddr_t, uint32_t, int);
 static uint32_t ql_send_buffer_data(caddr_t, caddr_t, uint32_t, int);
 static int ql_24xx_flash_desc(ql_adapter_state_t *);
 static int ql_setup_flash(ql_adapter_state_t *);
 static ql_tgt_t *ql_find_port(ql_adapter_state_t *, uint8_t *, uint16_t);

@@ -114,12 +115,12 @@
 static void ql_get_statistics_fc(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_statistics_fc4(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_set_led_state(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_led_state(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_drive_led(ql_adapter_state_t *, uint32_t);
-static uint32_t ql_setup_led(ql_adapter_state_t *);
-static uint32_t ql_wrapup_led(ql_adapter_state_t *);
+static int ql_setup_led(ql_adapter_state_t *);
+static int ql_wrapup_led(ql_adapter_state_t *);
 static void ql_get_port_summary(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_target_id(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_sfp(ql_adapter_state_t *, EXT_IOCTL *, int);
 static int ql_dump_sfp(ql_adapter_state_t *, void *, int);
 static ql_fcache_t *ql_setup_fnode(ql_adapter_state_t *);

@@ -150,11 +151,18 @@
 static void ql_get_dcbx_parameters(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_xgmac_statistics(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_fcf_list(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_get_resource_counts(ql_adapter_state_t *, EXT_IOCTL *, int);
 static void ql_qry_adapter_versions(ql_adapter_state_t *, EXT_IOCTL *, int);
-static int ql_set_loop_point(ql_adapter_state_t *, uint16_t);
+static void ql_get_temperature(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_dump_cmd(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_serdes_reg(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_serdes_reg_ex(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_els_passthru(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_flash_update_caps(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_get_bbcr_data(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_get_priv_stats(ql_adapter_state_t *, EXT_IOCTL *, int);
 
 /* ******************************************************************** */
 /*                      External IOCTL support.                         */
 /* ******************************************************************** */
 

@@ -174,14 +182,14 @@
 int
 ql_alloc_xioctl_resource(ql_adapter_state_t *ha)
 {
         ql_xioctl_t     *xp;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (ha->xioctl != NULL) {
-                QL_PRINT_9(CE_CONT, "(%d): already allocated done\n",
+                QL_PRINT_9(ha, "already allocated done\n",
                     ha->instance);
                 return (0);
         }
 
         xp = kmem_zalloc(sizeof (ql_xioctl_t), KM_SLEEP);

@@ -198,11 +206,11 @@
                 EL(ha, "failed, kmem_zalloc-2\n");
                 ql_free_xioctl_resource(ha);
                 return (ENOMEM);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (0);
 }
 
 /*

@@ -218,14 +226,14 @@
 void
 ql_free_xioctl_resource(ql_adapter_state_t *ha)
 {
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (xp == NULL) {
-                QL_PRINT_9(CE_CONT, "(%d): already freed\n", ha->instance);
+                QL_PRINT_9(ha, "already freed\n");
                 return;
         }
 
         if (xp->aen_tracking_queue != NULL) {
                 kmem_free(xp->aen_tracking_queue, EXT_DEF_MAX_AEN_QUEUE *

@@ -234,11 +242,11 @@
         }
 
         kmem_free(xp, sizeof (ql_xioctl_t));
         ha->xioctl = NULL;
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_xioctl
  *      External IOCTL processing.

@@ -264,14 +272,14 @@
 ql_xioctl(ql_adapter_state_t *ha, int cmd, intptr_t arg, int mode,
     cred_t *cred_p, int *rval_p)
 {
         int     rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started, cmd=%d\n", ha->instance, cmd);
+        QL_PRINT_9(ha, "started, cmd=%d\n", cmd);
 
         if (ha->xioctl == NULL) {
-                QL_PRINT_9(CE_CONT, "(%d): no context\n", ha->instance);
+                QL_PRINT_9(ha, "no context\n");
                 return (ENXIO);
         }
 
         switch (cmd) {
         case EXT_CC_QUERY:

@@ -304,19 +312,27 @@
         case EXT_CC_GET_VP_CNT_ID:
         case EXT_CC_VPORT_CMD:
         case EXT_CC_ACCESS_FLASH:
         case EXT_CC_RESET_FW:
         case EXT_CC_MENLO_MANAGE_INFO:
+        case EXT_CC_I2C_DATA:
+        case EXT_CC_DUMP:
+        case EXT_CC_SERDES_REG_OP:
+        case EXT_CC_VF_STATE:
+        case EXT_CC_SERDES_REG_OP_EX:
+        case EXT_CC_ELS_PASSTHRU_OS:
+        case EXT_CC_FLASH_UPDATE_CAPS_OS:
+        case EXT_CC_GET_BBCR_DATA_OS:
                 rval = ql_sdm_ioctl(ha, cmd, (void *)arg, mode);
                 break;
         default:
                 /* function not supported. */
                 EL(ha, "function=%d not supported\n", cmd);
                 rval = ENOPROTOOPT;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -346,11 +362,11 @@
 {
         EXT_IOCTL               *cmd;
         int                     rval;
         ql_adapter_state_t      *vha;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Copy argument structure (EXT_IOCTL) from application land. */
         if ((rval = ql_sdm_setup(ha, &cmd, arg, mode,
             ql_validate_signature)) != 0) {
                 /*

@@ -366,12 +382,11 @@
          * Map the physical ha ptr (which the ioctl is called with)
          * to the virtual ha that the caller is addressing.
          */
         if (ha->flags & VP_ENABLED) {
                 /* Check that it is within range. */
-                if (cmd->HbaSelect > (CFG_IST(ha, CFG_CTRL_2422) ?
-                    MAX_24_VIRTUAL_PORTS : MAX_25_VIRTUAL_PORTS)) {
+                if (cmd->HbaSelect > ha->max_vports) {
                         EL(ha, "Invalid HbaSelect vp index: %xh\n",
                             cmd->HbaSelect);
                         cmd->Status = EXT_STATUS_INVALID_VPINDEX;
                         cmd->ResponseLen = 0;
                         return (EFAULT);

@@ -391,11 +406,11 @@
                         /*
                          * The specified vp index may be valid(within range)
                          * but it's not in the list. Currently this is all
                          * we can say.
                          */
-                        if (vha == NULL) {
+                        if (vha == NULL || !(vha->flags & VP_ENABLED)) {
                                 cmd->Status = EXT_STATUS_INVALID_VPINDEX;
                                 cmd->ResponseLen = 0;
                                 return (EFAULT);
                         }
                 }

@@ -403,15 +418,18 @@
 
         /*
          * If driver is suspended, stalled, or powered down rtn BUSY
          */
         if (ha->flags & ADAPTER_SUSPENDED ||
-            ha->task_daemon_flags & DRIVER_STALL ||
+            (ha->task_daemon_flags & (DRIVER_STALL | ISP_ABORT_NEEDED |
+            ABORT_ISP_ACTIVE | LOOP_RESYNC_NEEDED | LOOP_RESYNC_ACTIVE)) ||
             ha->power_level != PM_LEVEL_D0) {
                 EL(ha, " %s\n", ha->flags & ADAPTER_SUSPENDED ?
                     "driver suspended" :
-                    (ha->task_daemon_flags & DRIVER_STALL ? "driver stalled" :
+                    (ha->task_daemon_flags & (DRIVER_STALL | ISP_ABORT_NEEDED |
+                    ABORT_ISP_ACTIVE | LOOP_RESYNC_NEEDED |
+                    LOOP_RESYNC_ACTIVE) ? "driver stalled" :
                     "FCA powered down"));
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->ResponseLen = 0;
                 rval = EBUSY;
 

@@ -523,10 +541,31 @@
                 ql_access_flash(ha, cmd, mode);
                 break;
         case EXT_CC_RESET_FW_OS:
                 ql_reset_cmd(ha, cmd);
                 break;
+        case EXT_CC_I2C_DATA:
+                ql_get_temperature(ha, cmd, mode);
+                break;
+        case EXT_CC_DUMP_OS:
+                ql_dump_cmd(ha, cmd, mode);
+                break;
+        case EXT_CC_SERDES_REG_OP:
+                ql_serdes_reg(ha, cmd, mode);
+                break;
+        case EXT_CC_SERDES_REG_OP_EX:
+                ql_serdes_reg_ex(ha, cmd, mode);
+                break;
+        case EXT_CC_ELS_PASSTHRU_OS:
+                ql_els_passthru(ha, cmd, mode);
+                break;
+        case EXT_CC_FLASH_UPDATE_CAPS_OS:
+                ql_flash_update_caps(ha, cmd, mode);
+                break;
+        case EXT_CC_GET_BBCR_DATA_OS:
+                ql_get_bbcr_data(ha, cmd, mode);
+                break;
         default:
                 /* function not supported. */
                 EL(ha, "failed, function not supported=%d\n", ioctl_code);
 
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;

@@ -538,11 +577,11 @@
         if (ql_sdm_return(ha, cmd, arg, mode) == -1) {
                 EL(ha, "failed, sdm_return\n");
                 return (EFAULT);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (0);
 }
 
 /*

@@ -570,11 +609,11 @@
     int mode, boolean_t (*val_sig)(EXT_IOCTL *))
 {
         int             rval;
         EXT_IOCTL       *cmd;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Allocate local memory for EXT_IOCTL. */
         *cmd_struct = NULL;
         cmd = (EXT_IOCTL *)kmem_zalloc(sizeof (EXT_IOCTL), KM_SLEEP);
         if (cmd == NULL) {

@@ -602,11 +641,11 @@
                         rval = EINVAL;
                 }
         }
 
         if (rval == 0) {
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
                 *cmd_struct = cmd;
                 cmd->Status = EXT_STATUS_OK;
                 cmd->DetailStatus = 0;
         } else {
                 kmem_free((void *)cmd, sizeof (EXT_IOCTL));

@@ -638,11 +677,11 @@
          * If signature is not valid then neither is the rest of
          * the structure (e.g., can't trust it), so don't attempt
          * to return any error status other than the errno.
          */
         if (bcmp(&cmd_struct->Signature, "QLOGIC", 6) != 0) {
-                QL_PRINT_2(CE_CONT, "failed,\n");
+                QL_PRINT_2(NULL, "failed,\n");
                 return (B_FALSE);
         }
 
         return (B_TRUE);
 }

@@ -670,11 +709,11 @@
 static int
 ql_sdm_return(ql_adapter_state_t *ha, EXT_IOCTL *cmd, void *arg, int mode)
 {
         int     rval = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         rval |= ddi_copyout((void *)&cmd->ResponseLen,
             (void *)&(((EXT_IOCTL*)arg)->ResponseLen), sizeof (uint32_t),
             mode);
 

@@ -691,11 +730,11 @@
                 /* Some copyout operation failed */
                 EL(ha, "failed, ddi_copyout\n");
                 return (EFAULT);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (0);
 }
 
 /*

@@ -714,11 +753,11 @@
  *      Kernel context.
  */
 static void
 ql_query(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started, cmd=%d\n", ha->instance,
+        QL_PRINT_9(ha, "started, cmd=%d\n",
             cmd->SubCode);
 
         /* case off on command subcode */
         switch (cmd->SubCode) {
         case EXT_SC_QUERY_HBA_NODE:

@@ -755,11 +794,11 @@
                 EL(ha, "failed, Unsupported Subcode=%xh\n",
                     cmd->SubCode);
                 break;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_qry_hba_node
  *      Performs EXT_SC_QUERY_HBA_NODE subfunction.

@@ -780,11 +819,11 @@
 {
         EXT_HBA_NODE    tmp_node = {0};
         uint_t          len;
         caddr_t         bufp;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_HBA_NODE)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_HBA_NODE);
                 EL(ha, "failed, ResponseLen < EXT_HBA_NODE, "

@@ -817,11 +856,11 @@
                 } else {
                         w = (uint16_t)ddi_get16(ha->sbus_fpga_dev_handle,
                             (uint16_t *)
                             (ha->sbus_fpga_iobase + FPGA_REVISION));
 
-                        tmpptr = (char *)&(tmp_node.DriverVersion[verlen+1]);
+                        tmpptr = (char *)&(tmp_node.DriverVersion[verlen + 1]);
                         if (tmpptr == NULL) {
                                 EL(ha, "Unable to insert fpga version str\n");
                         } else {
                                 (void) sprintf(tmpptr, "%d.%d",
                                     ((w & 0xf0) >> 4), (w & 0x0f));

@@ -832,11 +871,11 @@
 
         (void) sprintf((char *)(tmp_node.FWVersion), "%01d.%02d.%02d",
             ha->fw_major_version, ha->fw_minor_version,
             ha->fw_subminor_version);
 
-        if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 switch (ha->fw_attributes) {
                 case FWATTRIB_EF:
                         (void) strcat((char *)(tmp_node.FWVersion), " EF");
                         break;
                 case FWATTRIB_TP:

@@ -877,19 +916,25 @@
                 (void) sprintf((char *)tmp_node.OptRomVersion, "0");
         }
         tmp_node.PortCount = 1;
         tmp_node.InterfaceType = EXT_DEF_FC_INTF_TYPE;
 
+        tmp_node.MpiVersion[0] = ha->mpi_fw_major_version;
+        tmp_node.MpiVersion[1] = ha->mpi_fw_minor_version;
+        tmp_node.MpiVersion[2] = ha->mpi_fw_subminor_version;
+        tmp_node.PepFwVersion[0] = ha->phy_fw_major_version;
+        tmp_node.PepFwVersion[1] = ha->phy_fw_minor_version;
+        tmp_node.PepFwVersion[2] = ha->phy_fw_subminor_version;
         if (ddi_copyout((void *)&tmp_node,
             (void *)(uintptr_t)(cmd->ResponseAdr),
             sizeof (EXT_HBA_NODE), mode) != 0) {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_HBA_NODE);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_qry_hba_port

@@ -909,16 +954,16 @@
 static void
 ql_qry_hba_port(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         ql_link_t       *link;
         ql_tgt_t        *tq;
-        ql_mbx_data_t   mr;
+        ql_mbx_data_t   mr = {0};
         EXT_HBA_PORT    tmp_port = {0};
         int             rval;
         uint16_t        port_cnt, tgt_cnt, index;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_HBA_PORT)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_HBA_PORT);
                 EL(ha, "failed, ResponseLen < EXT_HBA_NODE, Len=%xh\n",

@@ -974,10 +1019,16 @@
                         tmp_port.PortSpeed = EXT_DEF_PORTSPEED_8GBIT;
                         break;
                 case IIDMA_RATE_10GB:
                         tmp_port.PortSpeed = EXT_DEF_PORTSPEED_10GBIT;
                         break;
+                case IIDMA_RATE_16GB:
+                        tmp_port.PortSpeed = EXT_DEF_PORTSPEED_16GBIT;
+                        break;
+                case IIDMA_RATE_32GB:
+                        tmp_port.PortSpeed = EXT_DEF_PORTSPEED_32GBIT;
+                        break;
                 default:
                         tmp_port.PortSpeed = EXT_DEF_PORTSPEED_UNKNOWN;
                         EL(ha, "failed, data rate=%xh\n", mr.mb[1]);
                         break;
                 }

@@ -1011,39 +1062,61 @@
                 default:
                         EL(ha, "sfp_stat: %xh\n", ha->sfp_stat);
                         break;
 
                 }
-        } else if (CFG_IST(ha, CFG_CTRL_8081)) {
+        } else if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
                 tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_10GBIT;
-        } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+        } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
                 tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_4GBIT |
                     EXT_DEF_PORTSPEED_2GBIT | EXT_DEF_PORTSPEED_1GBIT);
-        } else if (CFG_IST(ha, CFG_CTRL_2300)) {
+        } else if (CFG_IST(ha, CFG_CTRL_23XX)) {
                 tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_2GBIT |
                     EXT_DEF_PORTSPEED_1GBIT);
-        } else if (CFG_IST(ha, CFG_CTRL_6322)) {
+        } else if (CFG_IST(ha, CFG_CTRL_63XX)) {
                 tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT;
-        } else if (CFG_IST(ha, CFG_CTRL_2200)) {
+        } else if (CFG_IST(ha, CFG_CTRL_22XX)) {
                 tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT;
+        } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+                tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_4GBIT |
+                    EXT_DEF_PORTSPEED_8GBIT | EXT_DEF_PORTSPEED_16GBIT;
+        } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_4GBIT |
+                    EXT_DEF_PORTSPEED_8GBIT | EXT_DEF_PORTSPEED_16GBIT |
+                    EXT_DEF_PORTSPEED_32GBIT;
         } else {
                 tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_UNKNOWN;
                 EL(ha, "unknown HBA type: %xh\n", ha->device_id);
         }
+
+        if (ha->task_daemon_flags & LOOP_DOWN) {
+                (void) ql_get_firmware_state(ha, NULL);
+        }
+
+        tmp_port.LinkState1 = ha->fw_state[1];
         tmp_port.LinkState2 = LSB(ha->sfp_stat);
+        tmp_port.LinkState3 = ha->fw_state[3];
+        tmp_port.LinkState6 = ha->fw_state[6];
+
         port_cnt = 0;
         tgt_cnt = 0;
 
         for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
                 for (link = ha->dev[index].first; link != NULL;
                     link = link->next) {
                         tq = link->base_address;
 
-                        if (!VALID_TARGET_ID(ha, tq->loop_id)) {
+                        if (!VALID_TARGET_ID(ha, tq->loop_id) ||
+                            tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
                                 continue;
                         }
 
+                        if (tq->flags & (TQF_RSCN_RCVD | TQF_IIDMA_NEEDED |
+                            TQF_NEED_AUTHENTICATION | TQF_PLOGI_PROGRS)) {
+                                continue;
+                        }
+
                         port_cnt++;
                         if ((tq->flags & TQF_INITIATOR_DEVICE) == 0) {
                                 tgt_cnt++;
                         }
                 }

@@ -1061,11 +1134,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_HBA_PORT);
-                QL_PRINT_9(CE_CONT, "(%d): done, ports=%d, targets=%d\n",
+                QL_PRINT_9(ha, "done, ports=%d, targets=%d\n",
                     ha->instance, port_cnt, tgt_cnt);
         }
 }
 
 /*

@@ -1092,11 +1165,11 @@
         ql_link_t       *link;
         ql_tgt_t        *tq;
         uint16_t        index;
         uint16_t        inst = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_DISC_PORT)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_DISC_PORT);
                 EL(ha, "failed, ResponseLen < EXT_DISC_PORT, Len=%xh\n",

@@ -1109,13 +1182,20 @@
             index < DEVICE_HEAD_LIST_SIZE && link == NULL; index++) {
                 for (link = ha->dev[index].first; link != NULL;
                     link = link->next) {
                         tq = link->base_address;
 
-                        if (!VALID_TARGET_ID(ha, tq->loop_id)) {
+                        if (!VALID_TARGET_ID(ha, tq->loop_id) ||
+                            tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
                                 continue;
                         }
+
+                        if (tq->flags & (TQF_RSCN_RCVD | TQF_IIDMA_NEEDED |
+                            TQF_NEED_AUTHENTICATION | TQF_PLOGI_PROGRS)) {
+                                continue;
+                        }
+
                         if (inst != cmd->Instance) {
                                 inst++;
                                 continue;
                         }
 

@@ -1169,11 +1249,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_DISC_PORT);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_qry_disc_tgt

@@ -1199,11 +1279,11 @@
         ql_link_t       *link;
         ql_tgt_t        *tq;
         uint16_t        index;
         uint16_t        inst = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started, target=%d\n", ha->instance,
+        QL_PRINT_9(ha, "started, target=%d\n",
             cmd->Instance);
 
         if (cmd->ResponseLen < sizeof (EXT_DISC_TARGET)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_DISC_TARGET);

@@ -1219,11 +1299,12 @@
                 for (link = ha->dev[index].first; link != NULL;
                     link = link->next) {
                         tq = link->base_address;
 
                         if (!VALID_TARGET_ID(ha, tq->loop_id) ||
-                            tq->flags & TQF_INITIATOR_DEVICE) {
+                            tq->flags & TQF_INITIATOR_DEVICE ||
+                            tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
                                 continue;
                         }
                         if (inst != cmd->Instance) {
                                 inst++;
                                 continue;

@@ -1281,11 +1362,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_DISC_TARGET);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_qry_fw

@@ -1305,11 +1386,11 @@
 static void
 ql_qry_fw(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_FW          fw_info = {0};
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_FW)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_FW);
                 EL(ha, "failed, ResponseLen < EXT_FW, Len=%xh\n",

@@ -1331,11 +1412,11 @@
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
                 return;
         } else {
                 cmd->ResponseLen = sizeof (EXT_FW);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_qry_chip

@@ -1354,12 +1435,13 @@
  */
 static void
 ql_qry_chip(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_CHIP        chip = {0};
+        uint16_t        PciDevNumber;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_CHIP)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_CHIP);
                 EL(ha, "failed, ResponseLen < EXT_CHIP, Len=%xh\n",

@@ -1375,23 +1457,28 @@
         chip.IoAddr = ql_pci_config_get32(ha, PCI_CONF_BASE0);
         chip.IoAddrLen = 0x100;
         chip.MemAddr = ql_pci_config_get32(ha, PCI_CONF_BASE1);
         chip.MemAddrLen = 0x100;
         chip.ChipRevID = ha->rev_id;
-        if (ha->flags & FUNCTION_1) {
-                chip.FuncNo = 1;
-        }
+        chip.FuncNo = ha->pci_function_number;
+        chip.PciBusNumber = (uint16_t)
+            ((ha->pci_bus_addr & PCI_REG_BUS_M) >> PCI_REG_BUS_SHIFT);
 
+        PciDevNumber = (uint16_t)
+            ((ha->pci_bus_addr & PCI_REG_DEV_M) >> PCI_REG_DEV_SHIFT);
+        chip.PciSlotNumber = (uint16_t)(((PciDevNumber << 3) & 0xF8) |
+            (chip.FuncNo & 0x7));
+
         if (ddi_copyout((void *)&chip,
             (void *)(uintptr_t)(cmd->ResponseAdr),
             sizeof (EXT_CHIP), mode) != 0) {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_CHIP);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_qry_driver

@@ -1411,11 +1498,11 @@
 static void
 ql_qry_driver(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_DRIVER      qd = {0};
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_DRIVER)) {
                 cmd->Status = EXT_STATUS_DATA_OVERRUN;
                 cmd->DetailStatus = sizeof (EXT_DRIVER);
                 EL(ha, "failed, ResponseLen < EXT_DRIVER, Len=%xh\n",

@@ -1425,11 +1512,11 @@
         }
 
         (void) strcpy((void *)&qd.Version[0], QL_VERSION);
         qd.NumOfBus = 1;        /* Fixed for Solaris */
         qd.TargetsPerBus = (uint16_t)
-            (CFG_IST(ha, (CFG_CTRL_24258081 | CFG_EXT_FW_INTERFACE)) ?
+            (CFG_IST(ha, (CFG_ISP_FW_TYPE_2 | CFG_EXT_FW_INTERFACE)) ?
             MAX_24_FIBRE_DEVICES : MAX_22_FIBRE_DEVICES);
         qd.LunsPerTarget = 2030;
         qd.MaxTransferLen = QL_DMA_MAX_XFER_SIZE;
         qd.MaxDataSegments = QL_DMA_SG_LIST_LENGTH;
 

@@ -1438,11 +1525,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_DRIVER);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_fcct

@@ -1471,14 +1558,14 @@
         ql_ct_iu_preamble_t     *ct;
         ql_xioctl_t             *xp = ha->xioctl;
         ql_tgt_t                tq;
         uint16_t                comp_status, loop_id;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Get CT argument structure. */
-        if ((ha->topology & QL_SNS_CONNECTION) == 0) {
+        if ((ha->topology & QL_FABRIC_CONNECTION) == 0) {
                 EL(ha, "failed, No switch\n");
                 cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -1493,11 +1580,11 @@
         /* Login management server device. */
         if ((xp->flags & QL_MGMT_SERVER_LOGIN) == 0) {
                 tq.d_id.b.al_pa = 0xfa;
                 tq.d_id.b.area = 0xff;
                 tq.d_id.b.domain = 0xff;
-                tq.loop_id = (uint16_t)(CFG_IST(ha, CFG_CTRL_24258081) ?
+                tq.loop_id = (uint16_t)(CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
                     MANAGEMENT_SERVER_24XX_LOOP_ID :
                     MANAGEMENT_SERVER_LOOP_ID);
                 rval = ql_login_fport(ha, &tq, tq.loop_id, LFF_NO_PRLI, &mr);
                 if (rval != QL_SUCCESS) {
                         EL(ha, "failed, server login\n");

@@ -1507,11 +1594,11 @@
                 } else {
                         xp->flags |= QL_MGMT_SERVER_LOGIN;
                 }
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): cmd\n", ha->instance);
+        QL_PRINT_9(ha, "cmd\n");
         QL_DUMP_9(cmd, 8, sizeof (EXT_IOCTL));
 
         /* Allocate a DMA Memory Descriptor */
         dma_mem = (dma_mem_t *)kmem_zalloc(sizeof (dma_mem_t), KM_SLEEP);
         if (dma_mem == NULL) {

@@ -1549,12 +1636,12 @@
         }
 
         /* Get DMA memory for the IOCB */
         if (ql_get_dma_mem(ha, dma_mem, pkt_size, LITTLE_ENDIAN_DMA,
             QL_DMA_RING_ALIGN) != QL_SUCCESS) {
-                cmn_err(CE_WARN, "%s(%d): DMA memory "
-                    "alloc failed", QL_NAME, ha->instance);
+                cmn_err(CE_WARN, "%sDMA memory "
+                    "alloc failed", QL_NAME);
                 kmem_free(pkt, pkt_size);
                 kmem_free(dma_mem, sizeof (dma_mem_t));
                 cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
                 cmd->ResponseLen = 0;
                 return;

@@ -1570,11 +1657,11 @@
 
         /*
          * Setup IOCB
          */
         ct = (ql_ct_iu_preamble_t *)pld;
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 pkt->ms24.entry_type = CT_PASSTHRU_TYPE;
                 pkt->ms24.entry_count = 1;
 
                 pkt->ms24.vp_index = ha->vp_index;
 

@@ -1595,11 +1682,11 @@
                 pkt->ms24.cmd_byte_count = LE_32(cmd->RequestLen);
 
                 /* Load ct rsp byte count. */
                 pkt->ms24.resp_byte_count = LE_32(cmd->ResponseLen);
 
-                long_ptr = (uint32_t *)&pkt->ms24.dseg_0_address;
+                long_ptr = (uint32_t *)&pkt->ms24.dseg;
 
                 /* Load MS command entry data segments. */
                 *long_ptr++ = (uint32_t)
                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
                 *long_ptr++ = (uint32_t)

@@ -1657,24 +1744,24 @@
                 pkt->ms.cmd_dseg_count_l = 1;
                 pkt->ms.total_dseg_count = LE_16(2);
 
                 /* Response total byte count. */
                 pkt->ms.resp_byte_count = LE_32(cmd->ResponseLen);
-                pkt->ms.dseg_1_length = LE_32(cmd->ResponseLen);
+                pkt->ms.dseg[1].length = LE_32(cmd->ResponseLen);
 
                 /* Command total byte count. */
                 pkt->ms.cmd_byte_count = LE_32(cmd->RequestLen);
-                pkt->ms.dseg_0_length = LE_32(cmd->RequestLen);
+                pkt->ms.dseg[0].length = LE_32(cmd->RequestLen);
 
                 /* Load command/response data segments. */
-                pkt->ms.dseg_0_address[0] = (uint32_t)
+                pkt->ms.dseg[0].address[0] = (uint32_t)
                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
-                pkt->ms.dseg_0_address[1] = (uint32_t)
+                pkt->ms.dseg[0].address[1] = (uint32_t)
                     LE_32(MSD(dma_mem->cookie.dmac_laddress));
-                pkt->ms.dseg_1_address[0] = (uint32_t)
+                pkt->ms.dseg[1].address[0] = (uint32_t)
                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
-                pkt->ms.dseg_1_address[1] = (uint32_t)
+                pkt->ms.dseg[1].address[1] = (uint32_t)
                     LE_32(MSD(dma_mem->cookie.dmac_laddress));
 
                 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
                     sizeof (ql_mbx_iocb_t));
 

@@ -1704,11 +1791,11 @@
             (uint8_t *)dma_mem->bp, pld_byte_cnt,
             DDI_DEV_AUTOINCR);
 
         /* Copy response payload from DMA buffer to application. */
         if (cmd->ResponseLen != 0) {
-                QL_PRINT_9(CE_CONT, "(%d): ResponseLen=%d\n", ha->instance,
+                QL_PRINT_9(ha, "ResponseLen=%d\n",
                     cmd->ResponseLen);
                 QL_DUMP_9(pld, 8, cmd->ResponseLen);
 
                 /* Send response payload. */
                 if (ql_send_buffer_data(pld,

@@ -1722,11 +1809,11 @@
 
         kmem_free(pkt, pkt_size);
         ql_free_dma_resource(ha, dma_mem);
         kmem_free(dma_mem, sizeof (dma_mem_t));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_aen_reg
  *      IOCTL management server Asynchronous Event Tracking Enable/Disable.

@@ -1747,11 +1834,11 @@
 {
         EXT_REG_AEN     reg_struct;
         int             rval = 0;
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         rval = ddi_copyin((void*)(uintptr_t)cmd->RequestAdr, &reg_struct,
             cmd->RequestLen, mode);
 
         if (rval == 0) {

@@ -1763,11 +1850,11 @@
                         INTR_LOCK(ha);
                         xp->aen_q_head = 0;
                         xp->aen_q_tail = 0;
                         INTR_UNLOCK(ha);
                 }
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         } else {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 EL(ha, "failed, ddi_copyin\n");
         }
 }

@@ -1796,11 +1883,11 @@
         uint8_t         i;
         uint8_t         queue_cnt;
         uint8_t         request_cnt;
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Compute the number of events that can be returned */
         request_cnt = (uint8_t)(cmd->ResponseLen / sizeof (EXT_ASYNC_EVENT));
 
         if (request_cnt < EXT_DEF_MAX_AEN_QUEUE) {

@@ -1853,11 +1940,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = out_size;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_enqueue_aen

@@ -1877,15 +1964,15 @@
         uint8_t                 new_entry;      /* index to current entry */
         uint16_t                *mbx;
         EXT_ASYNC_EVENT         *aen_queue;
         ql_xioctl_t             *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started, event_code=%d\n", ha->instance,
+        QL_PRINT_9(ha, "started, event_code=%d\n",
             event_code);
 
         if (xp == NULL) {
-                QL_PRINT_9(CE_CONT, "(%d): no context\n", ha->instance);
+                QL_PRINT_9(ha, "no context\n");
                 return;
         }
         aen_queue = (EXT_ASYNC_EVENT *)xp->aen_tracking_queue;
 
         if (aen_queue[xp->aen_q_tail].AsyncEventCode != NULL) {

@@ -1947,11 +2034,11 @@
                         aen_queue[new_entry].AsyncEventCode = 0;
                         break;
                 }
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_scsi_passthru
  *      IOCTL SCSI passthrough.

@@ -2011,11 +2098,11 @@
                 uint8_t         state_flags_h;
                 uint8_t         scsi_status_l;
                 uint8_t         scsi_status_h;
         } sts;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Verify Sub Code and set cnt to needed request size. */
         if (cmd->SubCode == EXT_SC_SEND_SCSI_PASSTHRU) {
                 pld_size = sizeof (EXT_SCSI_PASSTHRU);
         } else if (cmd->SubCode == EXT_SC_SEND_FC_SCSI_PASSTHRU) {

@@ -2067,42 +2154,42 @@
                 scsi_req.u_sense = &usp_req->SenseData[0];
                 cmd->DetailStatus = EXT_DSTATUS_TARGET;
 
                 qlnt = QLNT_PORT;
                 name = (uint8_t *)&sp_req->TargetAddr.Target;
-                QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, Target=%lld\n",
+                QL_PRINT_9(ha, "SubCode=%xh, Target=%lld\n",
                     ha->instance, cmd->SubCode, sp_req->TargetAddr.Target);
                 tq = ql_find_port(ha, name, qlnt);
         } else {
                 /*
                  * Must be FC PASSTHRU, verified above.
                  */
                 if (fc_req->FCScsiAddr.DestType == EXT_DEF_DESTTYPE_WWPN) {
                         qlnt = QLNT_PORT;
                         name = &fc_req->FCScsiAddr.DestAddr.WWPN[0];
-                        QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, "
+                        QL_PRINT_9(ha, "SubCode=%xh, "
                             "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
                             ha->instance, cmd->SubCode, name[0], name[1],
                             name[2], name[3], name[4], name[5], name[6],
                             name[7]);
                         tq = ql_find_port(ha, name, qlnt);
                 } else if (fc_req->FCScsiAddr.DestType ==
                     EXT_DEF_DESTTYPE_WWNN) {
                         qlnt = QLNT_NODE;
                         name = &fc_req->FCScsiAddr.DestAddr.WWNN[0];
-                        QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, "
+                        QL_PRINT_9(ha, "SubCode=%xh, "
                             "wwnn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
                             ha->instance, cmd->SubCode, name[0], name[1],
                             name[2], name[3], name[4], name[5], name[6],
                             name[7]);
                         tq = ql_find_port(ha, name, qlnt);
                 } else if (fc_req->FCScsiAddr.DestType ==
                     EXT_DEF_DESTTYPE_PORTID) {
                         qlnt = QLNT_PID;
                         name = &fc_req->FCScsiAddr.DestAddr.Id[0];
-                        QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, PID="
-                            "%02x%02x%02x\n", ha->instance, cmd->SubCode,
+                        QL_PRINT_9(ha, "SubCode=%xh, PID="
+                            "%02x%02x%02x\n", cmd->SubCode,
                             name[0], name[1], name[2]);
                         tq = ql_find_port(ha, name, qlnt);
                 } else {
                         EL(ha, "failed, SubCode=%xh invalid DestType=%xh\n",
                             cmd->SubCode, fc_req->FCScsiAddr.DestType);

@@ -2149,25 +2236,25 @@
                 pld = (caddr_t)pkt + sizeof (ql_mbx_iocb_t);
 
                 /* Get DMA memory for the IOCB */
                 if (ql_get_dma_mem(ha, dma_mem, pld_size, LITTLE_ENDIAN_DMA,
                     QL_DMA_DATA_ALIGN) != QL_SUCCESS) {
-                        cmn_err(CE_WARN, "%s(%d): request queue DMA memory "
-                            "alloc failed", QL_NAME, ha->instance);
+                        cmn_err(CE_WARN, "%srequest queue DMA memory "
+                            "alloc failed", QL_NAME);
                         kmem_free(pkt, pkt_size);
                         cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
                         cmd->ResponseLen = 0;
                         return;
                 }
 
                 if (scsi_req.direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) {
                         scsi_req.direction = (uint8_t)
-                            (CFG_IST(ha, CFG_CTRL_24258081) ?
+                            (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
                             CF_RD : CF_DATA_IN | CF_STAG);
                 } else {
                         scsi_req.direction = (uint8_t)
-                            (CFG_IST(ha, CFG_CTRL_24258081) ?
+                            (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
                             CF_WR : CF_DATA_OUT | CF_STAG);
                         cmd->ResponseLen = 0;
 
                         /* Get command payload. */
                         if (ql_get_buffer_data(

@@ -2191,11 +2278,11 @@
                         (void) ddi_dma_sync(dma_mem->dma_handle, 0,
                             dma_mem->size, DDI_DMA_SYNC_FORDEV);
                 }
         } else {
                 scsi_req.direction = (uint8_t)
-                    (CFG_IST(ha, CFG_CTRL_24258081) ? 0 : CF_STAG);
+                    (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? 0 : CF_STAG);
                 cmd->ResponseLen = 0;
 
                 pkt_size = sizeof (ql_mbx_iocb_t);
                 pkt = kmem_zalloc(pkt_size, KM_SLEEP);
                 if (pkt == NULL) {

@@ -2210,27 +2297,47 @@
         /* retries = ha->port_down_retry_count; */
         retries = 1;
         cmd->Status = EXT_STATUS_OK;
         cmd->DetailStatus = EXT_DSTATUS_NOADNL_INFO;
 
-        QL_PRINT_9(CE_CONT, "(%d): SCSI cdb\n", ha->instance);
+        QL_PRINT_9(ha, "SCSI cdb\n");
         QL_DUMP_9(scsi_req.cdbp, 8, scsi_req.cdb_len);
 
         do {
                 if (DRIVER_SUSPENDED(ha)) {
                         sts.comp_status = CS_LOOP_DOWN_ABORT;
                         break;
                 }
 
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                        uint64_t                lun_addr = 0;
+                        fcp_ent_addr_t          *fcp_ent_addr = 0;
+
                         pkt->cmd24.entry_type = IOCB_CMD_TYPE_7;
                         pkt->cmd24.entry_count = 1;
 
-                        /* Set LUN number */
-                        pkt->cmd24.fcp_lun[2] = LSB(scsi_req.lun);
-                        pkt->cmd24.fcp_lun[3] = MSB(scsi_req.lun);
+                        /* Set LUN number and address method */
+                        lun_addr = ql_get_lun_addr(tq, scsi_req.lun);
+                        fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
 
+                        pkt->cmd24.fcp_lun[2] =
+                            lobyte(fcp_ent_addr->ent_addr_0);
+                        pkt->cmd24.fcp_lun[3] =
+                            hibyte(fcp_ent_addr->ent_addr_0);
+                        pkt->cmd24.fcp_lun[0] =
+                            lobyte(fcp_ent_addr->ent_addr_1);
+                        pkt->cmd24.fcp_lun[1] =
+                            hibyte(fcp_ent_addr->ent_addr_1);
+                        pkt->cmd24.fcp_lun[6] =
+                            lobyte(fcp_ent_addr->ent_addr_2);
+                        pkt->cmd24.fcp_lun[7] =
+                            hibyte(fcp_ent_addr->ent_addr_2);
+                        pkt->cmd24.fcp_lun[4] =
+                            lobyte(fcp_ent_addr->ent_addr_3);
+                        pkt->cmd24.fcp_lun[5] =
+                            hibyte(fcp_ent_addr->ent_addr_3);
+
                         /* Set N_port handle */
                         pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
 
                         /* Set VP Index */
                         pkt->cmd24.vp_index = ha->vp_index;

@@ -2242,13 +2349,13 @@
 
                         /* Set ISP command timeout. */
                         pkt->cmd24.timeout = (uint16_t)LE_16(15);
 
                         /* Load SCSI CDB */
-                        ddi_rep_put8(ha->hba_buf.acc_handle, scsi_req.cdbp,
-                            pkt->cmd24.scsi_cdb, scsi_req.cdb_len,
-                            DDI_DEV_AUTOINCR);
+                        ddi_rep_put8(ha->req_q[0]->req_ring.acc_handle,
+                            scsi_req.cdbp, pkt->cmd24.scsi_cdb,
+                            scsi_req.cdb_len, DDI_DEV_AUTOINCR);
                         for (cnt = 0; cnt < MAX_CMDSZ;
                             cnt = (uint16_t)(cnt + 4)) {
                                 ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
                                     + cnt, 4);
                         }

@@ -2265,15 +2372,15 @@
 
                                 /* Load total byte count. */
                                 pkt->cmd24.total_byte_count = LE_32(pld_size);
 
                                 /* Load data descriptor. */
-                                pkt->cmd24.dseg_0_address[0] = (uint32_t)
+                                pkt->cmd24.dseg.address[0] = (uint32_t)
                                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
-                                pkt->cmd24.dseg_0_address[1] = (uint32_t)
+                                pkt->cmd24.dseg.address[1] = (uint32_t)
                                     LE_32(MSD(dma_mem->cookie.dmac_laddress));
-                                pkt->cmd24.dseg_0_length = LE_32(pld_size);
+                                pkt->cmd24.dseg.length = LE_32(pld_size);
                         }
                 } else if (CFG_IST(ha, CFG_ENABLE_64BIT_ADDRESSING)) {
                         pkt->cmd3.entry_type = IOCB_CMD_TYPE_3;
                         pkt->cmd3.entry_count = 1;
                         if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {

@@ -2290,15 +2397,15 @@
                                 pkt->cmd3.scsi_cdb[cnt] = scsi_req.cdbp[cnt];
                         }
                         if (pld_size) {
                                 pkt->cmd3.dseg_count = LE_16(1);
                                 pkt->cmd3.byte_count = LE_32(pld_size);
-                                pkt->cmd3.dseg_0_address[0] = (uint32_t)
+                                pkt->cmd3.dseg[0].address[0] = (uint32_t)
                                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
-                                pkt->cmd3.dseg_0_address[1] = (uint32_t)
+                                pkt->cmd3.dseg[0].address[1] = (uint32_t)
                                     LE_32(MSD(dma_mem->cookie.dmac_laddress));
-                                pkt->cmd3.dseg_0_length = LE_32(pld_size);
+                                pkt->cmd3.dseg[0].length = LE_32(pld_size);
                         }
                 } else {
                         pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
                         pkt->cmd.entry_count = 1;
                         if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {

@@ -2315,17 +2422,17 @@
                                 pkt->cmd.scsi_cdb[cnt] = scsi_req.cdbp[cnt];
                         }
                         if (pld_size) {
                                 pkt->cmd.dseg_count = LE_16(1);
                                 pkt->cmd.byte_count = LE_32(pld_size);
-                                pkt->cmd.dseg_0_address = (uint32_t)
+                                pkt->cmd.dseg[0].address = (uint32_t)
                                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
-                                pkt->cmd.dseg_0_length = LE_32(pld_size);
+                                pkt->cmd.dseg[0].length = LE_32(pld_size);
                         }
                 }
                 /* Go issue command and wait for completion. */
-                QL_PRINT_9(CE_CONT, "(%d): request pkt\n", ha->instance);
+                QL_PRINT_9(ha, "request pkt\n");
                 QL_DUMP_9(pkt, 8, pkt_size);
 
                 status = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
 
                 if (pld_size) {

@@ -2336,11 +2443,11 @@
                         ddi_rep_get8(dma_mem->acc_handle, (uint8_t *)pld,
                             (uint8_t *)dma_mem->bp, pld_size,
                             DDI_DEV_AUTOINCR);
                 }
 
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         pkt->sts24.entry_status = (uint8_t)
                             (pkt->sts24.entry_status & 0x3c);
                 } else {
                         pkt->sts.entry_status = (uint8_t)
                             (pkt->sts.entry_status & 0x7e);

@@ -2350,11 +2457,12 @@
                         EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
                             pkt->sts.entry_status, tq->d_id.b24);
                         status = QL_FUNCTION_PARAMETER_ERROR;
                 }
 
-                sts.comp_status = (uint16_t)(CFG_IST(ha, CFG_CTRL_24258081) ?
+                sts.comp_status = (uint16_t)
+                    (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
                     LE_16(pkt->sts24.comp_status) :
                     LE_16(pkt->sts.comp_status));
 
                 /*
                  * We have verified about all the request that can be so far.

@@ -2413,11 +2521,11 @@
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Setup status. */
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 sts.scsi_status_l = pkt->sts24.scsi_status_l;
                 sts.scsi_status_h = pkt->sts24.scsi_status_h;
 
                 /* Setup residuals. */
                 sts.residual_length = LE_32(pkt->sts24.residual_length);

@@ -2488,11 +2596,11 @@
                 sts.req_sense_length = sts.scsi_status_h & FCP_SNS_LEN_VALID ?
                     LE_16(pkt->sts.req_sense_length) : 0;
                 sts.req_sense_data = &pkt->sts.req_sense_data[0];
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): response pkt\n", ha->instance);
+        QL_PRINT_9(ha, "response pkt\n");
         QL_DUMP_9(&pkt->sts, 8, sizeof (sts_entry_t));
 
         switch (sts.comp_status) {
         case CS_INCOMPLETE:
         case CS_ABORTED:

@@ -2552,15 +2660,15 @@
         }
 
         /* Correct ISP completion status */
         if (sts.comp_status == CS_COMPLETE && sts.scsi_status_l == 0 &&
             (sts.scsi_status_h & FCP_RSP_MASK) == 0) {
-                QL_PRINT_9(CE_CONT, "(%d): Correct completion\n",
+                QL_PRINT_9(ha, "Correct completion\n",
                     ha->instance);
                 scsi_req.resid = 0;
         } else if (sts.comp_status == CS_DATA_UNDERRUN) {
-                QL_PRINT_9(CE_CONT, "(%d): Correct UNDERRUN\n",
+                QL_PRINT_9(ha, "Correct UNDERRUN\n",
                     ha->instance);
                 scsi_req.resid = sts.residual_length;
                 if (sts.scsi_status_h & FCP_RESID_UNDER) {
                         cmd->Status = (uint32_t)EXT_STATUS_OK;
 

@@ -2570,12 +2678,12 @@
                         EL(ha, "failed, Transfer ERROR\n");
                         cmd->Status = EXT_STATUS_ERR;
                         cmd->ResponseLen = 0;
                 }
         } else {
-                QL_PRINT_9(CE_CONT, "(%d): error d_id=%xh, comp_status=%xh, "
-                    "scsi_status_h=%xh, scsi_status_l=%xh\n", ha->instance,
+                QL_PRINT_9(ha, "error d_id=%xh, comp_status=%xh, "
+                    "scsi_status_h=%xh, scsi_status_l=%xh\n",
                     tq->d_id.b24, sts.comp_status, sts.scsi_status_h,
                     sts.scsi_status_l);
 
                 scsi_req.resid = pld_size;
                 /*

@@ -2636,12 +2744,12 @@
         }
 
         /* Copy response payload from DMA buffer to application. */
         if (scsi_req.direction & (CF_RD | CF_DATA_IN) &&
             cmd->ResponseLen != 0) {
-                QL_PRINT_9(CE_CONT, "(%d): Data Return resid=%lu, "
-                    "byte_count=%u, ResponseLen=%xh\n", ha->instance,
+                QL_PRINT_9(ha, "Data Return resid=%lu, "
+                    "byte_count=%u, ResponseLen=%xh\n",
                     scsi_req.resid, pld_size, cmd->ResponseLen);
                 QL_DUMP_9(pld, 8, cmd->ResponseLen);
 
                 /* Send response payload. */
                 if (ql_send_buffer_data(pld,

@@ -2656,11 +2764,11 @@
         if (cmd->Status != EXT_STATUS_OK) {
                 EL(ha, "failed, cmd->Status=%xh, comp_status=%xh, "
                     "d_id=%xh\n", cmd->Status, sts.comp_status, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done, ResponseLen=%d\n",
+                QL_PRINT_9(ha, "done, ResponseLen=%d\n",
                     ha->instance, cmd->ResponseLen);
         }
 
         kmem_free(pkt, pkt_size);
         ql_free_dma_resource(ha, dma_mem);

@@ -2684,11 +2792,11 @@
         int             status;
         uint8_t         wwpn[EXT_DEF_WWN_NAME_SIZE];
         EXT_SCSI_ADDR   *tmp_addr;
         ql_tgt_t        *tq;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->RequestLen != EXT_DEF_WWN_NAME_SIZE) {
                 /* Return error */
                 EL(ha, "incorrect RequestLen\n");
                 cmd->Status = EXT_STATUS_INVALID_PARAM;

@@ -2722,11 +2830,11 @@
         if (status != 0) {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->Status = EXT_STATUS_OK;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_host_idx

@@ -2746,11 +2854,11 @@
 static void
 ql_host_idx(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         uint16_t        idx;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (uint16_t)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (uint16_t);
                 EL(ha, "failed, ResponseLen < Len=%xh\n", cmd->ResponseLen);

@@ -2765,11 +2873,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (uint16_t);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_host_drvname

@@ -2791,13 +2899,13 @@
 {
 
         char            drvname[] = QL_NAME;
         uint32_t        qlnamelen;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        qlnamelen = (uint32_t)(strlen(QL_NAME)+1);
+        qlnamelen = (uint32_t)(strlen(QL_NAME) + 1);
 
         if (cmd->ResponseLen < qlnamelen) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = qlnamelen;
                 EL(ha, "failed, ResponseLen: %xh, needed: %xh\n",

@@ -2811,14 +2919,14 @@
             qlnamelen, mode) != 0) {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
-                cmd->ResponseLen = qlnamelen-1;
+                cmd->ResponseLen = qlnamelen - 1;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_read_nvram
  *      Get NVRAM contents.

@@ -2836,11 +2944,11 @@
  */
 static void
 ql_read_nvram(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < ha->nvram_cache->size) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = ha->nvram_cache->size;
                 EL(ha, "failed, ResponseLen != NVRAM, Len=%xh\n",

@@ -2855,11 +2963,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, copy error\n");
         } else {
                 cmd->ResponseLen = ha->nvram_cache->size;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_write_nvram

@@ -2878,11 +2986,11 @@
  */
 static void
 ql_write_nvram(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->RequestLen < ha->nvram_cache->size) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = ha->nvram_cache->size;
                 EL(ha, "failed, RequestLen != NVRAM, Len=%xh\n",

@@ -2895,11 +3003,11 @@
             mode) != 0) {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 EL(ha, "failed, copy error\n");
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_write_vpd

@@ -2917,15 +3025,15 @@
  *      Kernel context.
  */
 static void
 ql_write_vpd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         int32_t         rval = 0;
 
-        if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 EL(ha, "failed, invalid request for HBA\n");
                 return;
         }
 

@@ -2943,11 +3051,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->DetailStatus = rval;
                 EL(ha, "failed, errno=%x\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_read_vpd

@@ -2965,13 +3073,13 @@
  *      Kernel context.
  */
 static void
 ql_read_vpd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 EL(ha, "failed, invalid request for HBA\n");
                 return;
         }
 

@@ -2988,11 +3096,11 @@
             mode)) != 0) {
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 EL(ha, "failed,\n");
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_get_fcache

@@ -3013,29 +3121,25 @@
 ql_get_fcache(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         uint32_t        bsize, boff, types, cpsize, hsize;
         ql_fcache_t     *fptr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        CACHE_LOCK(ha);
-
         if (ha->fcache == NULL) {
-                CACHE_UNLOCK(ha);
                 cmd->Status = EXT_STATUS_ERR;
                 EL(ha, "failed, adapter fcache not setup\n");
                 return;
         }
 
-        if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 bsize = 100;
         } else {
                 bsize = 400;
         }
 
         if (cmd->ResponseLen < bsize) {
-                CACHE_UNLOCK(ha);
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = bsize;
                 EL(ha, "failed, ResponseLen < %d, len passed=%xh\n",
                     bsize, cmd->ResponseLen);
                 return;

@@ -3056,11 +3160,10 @@
                         cpsize = (fptr->buflen < 100 ? fptr->buflen : 100);
 
                         if (ddi_copyout(fptr->buf,
                             (void *)(uintptr_t)(cmd->ResponseAdr + boff),
                             cpsize, mode) != 0) {
-                                CACHE_UNLOCK(ha);
                                 EL(ha, "ddicopy failed, done\n");
                                 cmd->Status = EXT_STATUS_COPY_ERR;
                                 cmd->DetailStatus = 0;
                                 return;
                         }

@@ -3077,11 +3180,10 @@
          */
         if ((fptr = ql_get_fbuf(ha->fcache, FTYPE_FW)) != NULL) {
 
                 hsize = sizeof (pci_header_t) + sizeof (pci_data_t);
                 if (hsize > fptr->buflen) {
-                        CACHE_UNLOCK(ha);
                         EL(ha, "header size (%xh) exceeds buflen (%xh)\n",
                             hsize, fptr->buflen);
                         cmd->Status = EXT_STATUS_COPY_ERR;
                         cmd->DetailStatus = 0;
                         return;

@@ -3088,27 +3190,25 @@
                 }
 
                 cpsize = ((fptr->buflen - hsize) < 100 ?
                     fptr->buflen - hsize : 100);
 
-                if (ddi_copyout(fptr->buf+hsize,
+                if (ddi_copyout(fptr->buf + hsize,
                     (void *)(uintptr_t)(cmd->ResponseAdr + 300),
                     cpsize, mode) != 0) {
-                        CACHE_UNLOCK(ha);
                         EL(ha, "fw ddicopy failed, done\n");
                         cmd->Status = EXT_STATUS_COPY_ERR;
                         cmd->DetailStatus = 0;
                         return;
                 }
                 bsize += 100;
         }
 
-        CACHE_UNLOCK(ha);
         cmd->Status = EXT_STATUS_OK;
         cmd->DetailStatus = bsize;
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_fcache_ex
  *      Dumps flash cache contents.

@@ -3129,15 +3229,13 @@
 {
         uint32_t        bsize = 0;
         uint32_t        boff = 0;
         ql_fcache_t     *fptr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        CACHE_LOCK(ha);
         if (ha->fcache == NULL) {
-                CACHE_UNLOCK(ha);
                 cmd->Status = EXT_STATUS_ERR;
                 EL(ha, "failed, adapter fcache not setup\n");
                 return;
         }
 

@@ -3145,11 +3243,10 @@
         for (fptr = ha->fcache; fptr != NULL; fptr = fptr->next) {
                 bsize += FBUFSIZE;
         }
 
         if (cmd->ResponseLen < bsize) {
-                CACHE_UNLOCK(ha);
                 if (cmd->ResponseLen != 0) {
                         EL(ha, "failed, ResponseLen < %d, len passed=%xh\n",
                             bsize, cmd->ResponseLen);
                 }
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;

@@ -3163,25 +3260,23 @@
                 /* Get the next image */
                 if (ddi_copyout(fptr->buf,
                     (void *)(uintptr_t)(cmd->ResponseAdr + boff),
                     (fptr->buflen < FBUFSIZE ? fptr->buflen : FBUFSIZE),
                     mode) != 0) {
-                        CACHE_UNLOCK(ha);
                         EL(ha, "failed, ddicopy at %xh, done\n", boff);
                         cmd->Status = EXT_STATUS_COPY_ERR;
                         cmd->DetailStatus = 0;
                         return;
                 }
                 boff += FBUFSIZE;
                 fptr = fptr->next;
         }
 
-        CACHE_UNLOCK(ha);
         cmd->Status = EXT_STATUS_OK;
         cmd->DetailStatus = bsize;
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_read_flash
  *      Get flash contents.

@@ -3200,14 +3295,16 @@
 static void
 ql_read_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (ql_stall_driver(ha, 0) != QL_SUCCESS) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1) &&
+            ql_stall_driver(ha, 0) != QL_SUCCESS) {
                 EL(ha, "ql_stall_driver failed\n");
+                ql_restart_driver(ha);
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->DetailStatus = xp->fdesc.flash_size;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -3235,19 +3332,17 @@
                         EL(ha, "failed,\n");
                 }
         }
 
         /* Resume I/O */
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                ql_restart_driver(ha);
-        } else {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 EL(ha, "isp_abort_needed for restart\n");
                 ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED,
                     DRIVER_STALL);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_write_flash
  *      Loads flash contents.

@@ -3266,14 +3361,16 @@
 static void
 ql_write_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (ql_stall_driver(ha, 0) != QL_SUCCESS) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1) &&
+            ql_stall_driver(ha, 0) != QL_SUCCESS) {
                 EL(ha, "ql_stall_driver failed\n");
+                ql_restart_driver(ha);
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->DetailStatus = xp->fdesc.flash_size;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -3298,19 +3395,17 @@
                         EL(ha, "failed,\n");
                 }
         }
 
         /* Resume I/O */
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                ql_restart_driver(ha);
-        } else {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 EL(ha, "isp_abort_needed for restart\n");
                 ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED,
                     DRIVER_STALL);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_diagnostic_loopback
  *      Performs EXT_CC_LOOPBACK Command

@@ -3330,15 +3425,16 @@
 ql_diagnostic_loopback(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_LOOPBACK_REQ        plbreq;
         EXT_LOOPBACK_RSP        plbrsp;
         ql_mbx_data_t           mr;
-        uint32_t                rval;
-        caddr_t                 bp;
+        uint32_t                rval, timer, bpsize;
+        caddr_t                 bp, pld;
         uint16_t                opt;
+        boolean_t               loop_up;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Get loop back request. */
         if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
             (void *)&plbreq, sizeof (EXT_LOOPBACK_REQ), mode) != 0) {
                 EL(ha, "failed, ddi_copyin\n");

@@ -3345,128 +3441,157 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 return;
         }
 
-        opt = (uint16_t)(plbreq.Options & MBC_LOOPBACK_POINT_MASK);
-
         /* Check transfer length fits in buffer. */
-        if (plbreq.BufferLength < plbreq.TransferCount &&
-            plbreq.TransferCount < MAILBOX_BUFFER_SIZE) {
-                EL(ha, "failed, BufferLength=%d, xfercnt=%d, "
-                    "mailbox_buffer_size=%d\n", plbreq.BufferLength,
-                    plbreq.TransferCount, MAILBOX_BUFFER_SIZE);
+        if (plbreq.BufferLength < plbreq.TransferCount) {
+                EL(ha, "failed, BufferLength=%d, xfercnt=%d\n",
+
+                    plbreq.BufferLength, plbreq.TransferCount);
                 cmd->Status = EXT_STATUS_INVALID_PARAM;
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Allocate command memory. */
-        bp = kmem_zalloc(plbreq.TransferCount, KM_SLEEP);
+        bpsize = plbreq.TransferCount + 4; /* Include opcode size */
+        bp = kmem_zalloc(bpsize, KM_SLEEP);
         if (bp == NULL) {
                 EL(ha, "failed, kmem_zalloc\n");
                 cmd->Status = EXT_STATUS_NO_MEMORY;
                 cmd->ResponseLen = 0;
                 return;
         }
+        pld = bp + 4;
+        *bp = 0x10;     /* opcode */
 
         /* Get loopback data. */
         if (ql_get_buffer_data((caddr_t)(uintptr_t)plbreq.BufferAddress,
-            bp, plbreq.TransferCount, mode) != plbreq.TransferCount) {
+            pld, plbreq.TransferCount, mode) != plbreq.TransferCount) {
                 EL(ha, "failed, ddi_copyin-2\n");
-                kmem_free(bp, plbreq.TransferCount);
+                kmem_free(bp, bpsize);
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 return;
         }
 
-        if ((ha->task_daemon_flags & (QL_LOOP_TRANSITION | DRIVER_STALL)) ||
+        if (LOOP_RECONFIGURE(ha) ||
             ql_stall_driver(ha, 0) != QL_SUCCESS) {
                 EL(ha, "failed, LOOP_NOT_READY\n");
-                kmem_free(bp, plbreq.TransferCount);
+                ql_restart_driver(ha);
+                kmem_free(bp, bpsize);
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->ResponseLen = 0;
                 return;
         }
+        loop_up = ha->task_daemon_flags & LOOP_DOWN ? B_FALSE : B_TRUE;
 
         /* Shutdown IP. */
         if (ha->flags & IP_INITIALIZED) {
                 (void) ql_shutdown_ip(ha);
         }
 
         /* determine topology so we can send the loopback or the echo */
         /* Echo is supported on 2300's only and above */
 
-        if (CFG_IST(ha, CFG_CTRL_8081)) {
-                if (!(ha->task_daemon_flags & LOOP_DOWN) && opt ==
-                    MBC_LOOPBACK_POINT_EXTERNAL) {
+        ADAPTER_STATE_LOCK(ha);
+        ha->flags |= LOOPBACK_ACTIVE;
+        ADAPTER_STATE_UNLOCK(ha);
+
+        opt = plbreq.Options;
+
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
+                opt = (uint16_t)(plbreq.Options & MBC_LOOPBACK_POINT_MASK);
+                if (loop_up && opt == MBC_LOOPBACK_POINT_EXTERNAL) {
                         if (plbreq.TransferCount > 252) {
                                 EL(ha, "transfer count (%d) > 252\n",
                                     plbreq.TransferCount);
-                                kmem_free(bp, plbreq.TransferCount);
+                                ql_restart_driver(ha);
+                                kmem_free(bp, bpsize);
                                 cmd->Status = EXT_STATUS_INVALID_PARAM;
                                 cmd->ResponseLen = 0;
                                 return;
                         }
                         plbrsp.CommandSent = INT_DEF_LB_ECHO_CMD;
-                        rval = ql_diag_echo(ha, 0, bp, plbreq.TransferCount,
+                        rval = ql_diag_echo(ha, pld, plbreq.TransferCount,
                             MBC_ECHO_ELS, &mr);
                 } else {
-                        if (CFG_IST(ha, CFG_CTRL_81XX)) {
+                        if (CFG_IST(ha, CFG_LOOP_POINT_SUPPORT)) {
                                 (void) ql_set_loop_point(ha, opt);
                         }
                         plbrsp.CommandSent = INT_DEF_LB_LOOPBACK_CMD;
-                        rval = ql_diag_loopback(ha, 0, bp, plbreq.TransferCount,
+                        rval = ql_diag_loopback(ha, pld, plbreq.TransferCount,
                             opt, plbreq.IterationCount, &mr);
-                        if (CFG_IST(ha, CFG_CTRL_81XX)) {
+                        if (mr.mb[0] == 0x4005 && mr.mb[1] == 0x17) {
+                                (void) ql_abort_isp(ha);
+                        }
+                        if (CFG_IST(ha, CFG_LOOP_POINT_SUPPORT)) {
                                 (void) ql_set_loop_point(ha, 0);
                         }
                 }
         } else {
-                if (!(ha->task_daemon_flags & LOOP_DOWN) &&
-                    (ha->topology & QL_F_PORT) &&
-                    ha->device_id >= 0x2300) {
-                        QL_PRINT_9(CE_CONT, "(%d): F_PORT topology -- using "
-                            "echo\n", ha->instance);
+                if (loop_up && (ha->topology & QL_F_PORT) &&
+                    CFG_IST(ha, CFG_LB_ECHO_SUPPORT)) {
+                        QL_PRINT_9(ha, "F_PORT topology -- using "
+                            "echo\n");
                         plbrsp.CommandSent = INT_DEF_LB_ECHO_CMD;
-                        rval = ql_diag_echo(ha, 0, bp, plbreq.TransferCount,
-                            (uint16_t)(CFG_IST(ha, CFG_CTRL_8081) ?
-                            MBC_ECHO_ELS : MBC_ECHO_64BIT), &mr);
+                        if ((rval = ql_diag_echo(ha, bp, bpsize,
+                            (uint16_t)(CFG_IST(ha, CFG_ISP_FW_TYPE_1) ?
+                            MBC_ECHO_64BIT : MBC_ECHO_ELS), &mr)) !=
+                            QL_SUCCESS) {
+                                rval = ql_diag_echo(ha, pld,
+                                    plbreq.TransferCount,
+                                    (uint16_t)(CFG_IST(ha, CFG_ISP_FW_TYPE_1) ?
+                                    MBC_ECHO_64BIT : 0), &mr);
+                        }
                 } else {
                         plbrsp.CommandSent = INT_DEF_LB_LOOPBACK_CMD;
-                        rval = ql_diag_loopback(ha, 0, bp, plbreq.TransferCount,
+                        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
+                                opt = (uint16_t)(opt | MBC_LOOPBACK_64BIT);
+                        }
+                        rval = ql_diag_loopback(ha, pld, plbreq.TransferCount,
                             opt, plbreq.IterationCount, &mr);
                 }
         }
+        ADAPTER_STATE_LOCK(ha);
+        ha->flags &= ~LOOPBACK_ACTIVE;
+        ADAPTER_STATE_UNLOCK(ha);
 
         ql_restart_driver(ha);
+        if (loop_up && opt == MBC_LOOPBACK_POINT_INTERNAL) {
+                timer = 30;
+                do {
+                        delay(100);
+                } while (timer-- && LOOP_NOT_READY(ha));
+        }
 
         /* Restart IP if it was shutdown. */
         if (ha->flags & IP_ENABLED && !(ha->flags & IP_INITIALIZED)) {
                 (void) ql_initialize_ip(ha);
                 ql_isp_rcvbuf(ha);
         }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, diagnostic_loopback_mbx=%xh\n", rval);
-                kmem_free(bp, plbreq.TransferCount);
+                kmem_free(bp, bpsize);
                 cmd->Status = EXT_STATUS_MAILBOX;
                 cmd->DetailStatus = rval;
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Return loopback data. */
-        if (ql_send_buffer_data(bp, (caddr_t)(uintptr_t)plbreq.BufferAddress,
+        if (ql_send_buffer_data(pld, (caddr_t)(uintptr_t)plbreq.BufferAddress,
             plbreq.TransferCount, mode) != plbreq.TransferCount) {
                 EL(ha, "failed, ddi_copyout\n");
-                kmem_free(bp, plbreq.TransferCount);
+                kmem_free(bp, bpsize);
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 return;
         }
-        kmem_free(bp, plbreq.TransferCount);
+        kmem_free(bp, bpsize);
 
         /* Return loopback results. */
         plbrsp.BufferAddress = plbreq.BufferAddress;
         plbrsp.BufferLength = plbreq.TransferCount;
         plbrsp.CompletionStatus = mr.mb[0];

@@ -3478,11 +3603,12 @@
                 plbrsp.IterationCountLastError = 0;
         } else {
                 plbrsp.CrcErrorCount = mr.mb[1];
                 plbrsp.DisparityErrorCount = mr.mb[2];
                 plbrsp.FrameLengthErrorCount = mr.mb[3];
-                plbrsp.IterationCountLastError = (mr.mb[19] >> 16) | mr.mb[18];
+                plbrsp.IterationCountLastError =
+                    SHORT_TO_LONG(mr.mb[18], mr.mb[19]);
         }
 
         rval = ddi_copyout((void *)&plbrsp,
             (void *)(uintptr_t)cmd->ResponseAdr,
             sizeof (EXT_LOOPBACK_RSP), mode);

@@ -3492,11 +3618,11 @@
                 cmd->ResponseLen = 0;
                 return;
         }
         cmd->ResponseLen = sizeof (EXT_LOOPBACK_RSP);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_set_loop_point
  *      Setup loop point for port configuration.

@@ -3509,18 +3635,18 @@
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
-static int
+int
 ql_set_loop_point(ql_adapter_state_t *ha, uint16_t opt)
 {
         ql_mbx_data_t   mr;
         int             rval;
         uint32_t        timer;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /*
          * We get the current port config, modify the loopback field and
          * write it back out.
          */

@@ -3528,16 +3654,17 @@
                 EL(ha, "get_port_config status=%xh\n", rval);
                 return (rval);
         }
         /*
          * Set the loopback mode field while maintaining the others.
-         * Currently only internal or none are supported.
          */
-        mr.mb[1] = (uint16_t)(mr.mb[1] &~LOOPBACK_MODE_FIELD_MASK);
+        mr.mb[1] = (uint16_t)(mr.mb[1] & ~LOOPBACK_MODE_FIELD_MASK);
         if (opt == MBC_LOOPBACK_POINT_INTERNAL) {
-                mr.mb[1] = (uint16_t)(mr.mb[1] |
-                    LOOPBACK_MODE(LOOPBACK_MODE_INTERNAL));
+                mr.mb[1] = (uint16_t)(mr.mb[1] | LOOPBACK_MODE_INTERNAL);
+        } else if (CFG_IST(ha, CFG_CTRL_80XX) &&
+            opt == MBC_LOOPBACK_POINT_EXTERNAL) {
+                mr.mb[1] = (uint16_t)(mr.mb[1] | LOOPBACK_MODE_EXTERNAL);
         }
         /*
          * Changing the port configuration will cause the port state to cycle
          * down and back up. The indication that this has happened is that
          * the point to point flag gets set.

@@ -3556,11 +3683,11 @@
                 }
                 /* Delay for 1000000 usec (1 second). */
                 ql_delay(ha, 1000000);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -3583,17 +3710,17 @@
 {
         EXT_RNID_REQ    tmp_rnid;
         port_id_t       tmp_fcid;
         caddr_t         tmp_buf, bptr;
         uint32_t        copy_len;
-        ql_tgt_t        *tq;
+        ql_tgt_t        *tq = NULL;
         EXT_RNID_DATA   rnid_data;
         uint32_t        loop_ready_wait = 10 * 60 * 10;
         int             rval = 0;
         uint32_t        local_hba = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (DRIVER_SUSPENDED(ha)) {
                 EL(ha, "failed, LOOP_NOT_READY\n");
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->ResponseLen = 0;

@@ -3618,24 +3745,20 @@
                 return;
         }
 
         /* Find loop ID of the device */
         if (tmp_rnid.Addr.Type == EXT_DEF_TYPE_WWNN) {
-                bptr = CFG_IST(ha, CFG_CTRL_24258081) ?
-                    (caddr_t)&ha->init_ctrl_blk.cb24.node_name :
-                    (caddr_t)&ha->init_ctrl_blk.cb.node_name;
+                bptr = (caddr_t)ha->loginparams.node_ww_name.raw_wwn;
                 if (bcmp((void *)bptr, (void *)tmp_rnid.Addr.FcAddr.WWNN,
                     EXT_DEF_WWN_NAME_SIZE) == 0) {
                         local_hba = 1;
                 } else {
                         tq = ql_find_port(ha,
                             (uint8_t *)tmp_rnid.Addr.FcAddr.WWNN, QLNT_NODE);
                 }
         } else if (tmp_rnid.Addr.Type == EXT_DEF_TYPE_WWPN) {
-                bptr = CFG_IST(ha, CFG_CTRL_24258081) ?
-                    (caddr_t)&ha->init_ctrl_blk.cb24.port_name :
-                    (caddr_t)&ha->init_ctrl_blk.cb.port_name;
+                bptr = (caddr_t)ha->loginparams.nport_ww_name.raw_wwn;
                 if (bcmp((void *)bptr, (void *)tmp_rnid.Addr.FcAddr.WWPN,
                     EXT_DEF_WWN_NAME_SIZE) == 0) {
                         local_hba = 1;
                 } else {
                         tq = ql_find_port(ha,

@@ -3683,25 +3806,15 @@
                 /* Now build the Send RNID response */
                 tmp_buf[0] = (char)(EXT_DEF_RNID_DFORMAT_TOPO_DISC);
                 tmp_buf[1] = (2 * EXT_DEF_WWN_NAME_SIZE);
                 tmp_buf[2] = 0;
                 tmp_buf[3] = sizeof (EXT_RNID_DATA);
-
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                        bcopy(ha->init_ctrl_blk.cb24.port_name, &tmp_buf[4],
+                bcopy(ha->loginparams.nport_ww_name.raw_wwn, &tmp_buf[4],
                             EXT_DEF_WWN_NAME_SIZE);
-                        bcopy(ha->init_ctrl_blk.cb24.node_name,
+                bcopy(ha->loginparams.node_ww_name.raw_wwn,
                             &tmp_buf[4 + EXT_DEF_WWN_NAME_SIZE],
                             EXT_DEF_WWN_NAME_SIZE);
-                } else {
-                        bcopy(ha->init_ctrl_blk.cb.port_name, &tmp_buf[4],
-                            EXT_DEF_WWN_NAME_SIZE);
-                        bcopy(ha->init_ctrl_blk.cb.node_name,
-                            &tmp_buf[4 + EXT_DEF_WWN_NAME_SIZE],
-                            EXT_DEF_WWN_NAME_SIZE);
-                }
-
                 bcopy((uint8_t *)&rnid_data,
                     &tmp_buf[4 + 2 * EXT_DEF_WWN_NAME_SIZE],
                     sizeof (EXT_RNID_DATA));
         } else {
                 if (tq == NULL) {

@@ -3760,11 +3873,11 @@
                 } else if (cmd->ResponseLen > SEND_RNID_RSP_SIZE) {
                         cmd->Status = EXT_STATUS_DATA_UNDERRUN;
                         EL(ha, "failed, EXT_STATUS_DATA_UNDERRUN\n");
                 } else {
                         cmd->Status = EXT_STATUS_OK;
-                        QL_PRINT_9(CE_CONT, "(%d): done\n",
+                        QL_PRINT_9(ha, "done\n",
                             ha->instance);
                 }
         }
 
         kmem_free(tmp_buf, SEND_RNID_RSP_SIZE);

@@ -3786,11 +3899,11 @@
  *      Kernel context.
  */
 static void
 ql_set_host_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started, SubCode=%d\n", ha->instance,
+        QL_PRINT_9(ha, "started, SubCode=%d\n",
             cmd->SubCode);
 
         /*
          * case off on command subcode
          */

@@ -3825,11 +3938,11 @@
 
         if (cmd->Status != EXT_STATUS_OK) {
                 EL(ha, "failed, Status=%d\n", cmd->Status);
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_get_host_data

@@ -3849,11 +3962,11 @@
 static void
 ql_get_host_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         int     out_size = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started, SubCode=%d\n", ha->instance,
+        QL_PRINT_9(ha, "started, SubCode=%d\n",
             cmd->SubCode);
 
         /* case off on command subcode */
         switch (cmd->SubCode) {
         case EXT_SC_GET_STATISTICS:

@@ -3884,10 +3997,13 @@
                 out_size = sizeof (EXT_RESOURCE_CNTS);
                 break;
         case EXT_SC_GET_FCF_LIST:
                 out_size = sizeof (EXT_FCF_LIST);
                 break;
+        case EXT_SC_GET_PRIV_STATS:
+                out_size = cmd->ResponseLen;
+                break;
         case EXT_SC_GET_SCSI_ADDR:
         case EXT_SC_GET_ERR_DETECTIONS:
         case EXT_SC_GET_BUS_MODE:
         case EXT_SC_GET_DR_DUMP_BUF:
         case EXT_SC_GET_RISC_CODE:

@@ -3948,17 +4064,20 @@
                 ql_get_fcf_list(ha, cmd, mode);
                 break;
         case EXT_SC_GET_RESOURCE_CNTS:
                 ql_get_resource_counts(ha, cmd, mode);
                 break;
+        case EXT_SC_GET_PRIV_STATS:
+                ql_get_priv_stats(ha, cmd, mode);
+                break;
         }
 
         if (cmd->Status != EXT_STATUS_OK) {
                 EL(ha, "failed, Status=%d\n", cmd->Status);
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /* ******************************************************************** */
 /*                      Helper Functions                                */

@@ -3981,19 +4100,19 @@
 static int
 ql_lun_count(ql_adapter_state_t *ha, ql_tgt_t *tq)
 {
         int     cnt;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Bypass LUNs that failed. */
         cnt = ql_report_lun(ha, tq);
         if (cnt == 0) {
                 cnt = ql_inq_scan(ha, tq, ha->maximum_luns_per_target);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (cnt);
 }
 
 /*

@@ -4020,11 +4139,11 @@
         dma_mem_t               dma_mem;
         uint32_t                pkt_size, cnt;
         uint16_t                comp_status;
         uint8_t                 scsi_status_h, scsi_status_l, *reqs;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (DRIVER_SUSPENDED(ha)) {
                 EL(ha, "failed, LOOP_NOT_READY\n");
                 return (0);
         }

@@ -4038,18 +4157,18 @@
         rpt = (ql_rpt_lun_lst_t *)((caddr_t)pkt + sizeof (ql_mbx_iocb_t));
 
         /* Get DMA memory for the IOCB */
         if (ql_get_dma_mem(ha, &dma_mem, sizeof (ql_rpt_lun_lst_t),
             LITTLE_ENDIAN_DMA, QL_DMA_RING_ALIGN) != QL_SUCCESS) {
-                cmn_err(CE_WARN, "%s(%d): DMA memory "
+                cmn_err(CE_WARN, "%s(%d) DMA memory "
                     "alloc failed", QL_NAME, ha->instance);
                 kmem_free(pkt, pkt_size);
                 return (0);
         }
 
         for (retries = 0; retries < 4; retries++) {
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         pkt->cmd24.entry_type = IOCB_CMD_TYPE_7;
                         pkt->cmd24.entry_count = 1;
 
                         /* Set N_port handle */
                         pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);

@@ -4089,17 +4208,17 @@
                         /* Set data segment count. */
                         pkt->cmd24.dseg_count = LE_16(1);
 
                         /* Load total byte count. */
                         /* Load data descriptor. */
-                        pkt->cmd24.dseg_0_address[0] = (uint32_t)
+                        pkt->cmd24.dseg.address[0] = (uint32_t)
                             LE_32(LSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd24.dseg_0_address[1] = (uint32_t)
+                        pkt->cmd24.dseg.address[1] = (uint32_t)
                             LE_32(MSD(dma_mem.cookie.dmac_laddress));
                         pkt->cmd24.total_byte_count =
                             LE_32(sizeof (ql_rpt_lun_lst_t));
-                        pkt->cmd24.dseg_0_length =
+                        pkt->cmd24.dseg.length =
                             LE_32(sizeof (ql_rpt_lun_lst_t));
                 } else if (CFG_IST(ha, CFG_ENABLE_64BIT_ADDRESSING)) {
                         pkt->cmd3.entry_type = IOCB_CMD_TYPE_3;
                         pkt->cmd3.entry_count = 1;
                         if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {

@@ -4120,15 +4239,15 @@
                             MSB(LSW(sizeof (ql_rpt_lun_lst_t)));
                         pkt->cmd3.scsi_cdb[9] =
                             LSB(LSW(sizeof (ql_rpt_lun_lst_t)));
                         pkt->cmd3.byte_count =
                             LE_32(sizeof (ql_rpt_lun_lst_t));
-                        pkt->cmd3.dseg_0_address[0] = (uint32_t)
+                        pkt->cmd3.dseg[0].address[0] = (uint32_t)
                             LE_32(LSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd3.dseg_0_address[1] = (uint32_t)
+                        pkt->cmd3.dseg[0].address[1] = (uint32_t)
                             LE_32(MSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd3.dseg_0_length =
+                        pkt->cmd3.dseg[0].length =
                             LE_32(sizeof (ql_rpt_lun_lst_t));
                 } else {
                         pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
                         pkt->cmd.entry_count = 1;
                         if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {

@@ -4149,13 +4268,13 @@
                             MSB(LSW(sizeof (ql_rpt_lun_lst_t)));
                         pkt->cmd.scsi_cdb[9] =
                             LSB(LSW(sizeof (ql_rpt_lun_lst_t)));
                         pkt->cmd.byte_count =
                             LE_32(sizeof (ql_rpt_lun_lst_t));
-                        pkt->cmd.dseg_0_address = (uint32_t)
+                        pkt->cmd.dseg[0].address = (uint32_t)
                             LE_32(LSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd.dseg_0_length =
+                        pkt->cmd.dseg[0].length =
                             LE_32(sizeof (ql_rpt_lun_lst_t));
                 }
 
                 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
                     sizeof (ql_mbx_iocb_t));

@@ -4165,11 +4284,11 @@
                     DDI_DMA_SYNC_FORKERNEL);
                 /* Copy in coming DMA data. */
                 ddi_rep_get8(dma_mem.acc_handle, (uint8_t *)rpt,
                     (uint8_t *)dma_mem.bp, dma_mem.size, DDI_DEV_AUTOINCR);
 
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         pkt->sts24.entry_status = (uint8_t)
                             (pkt->sts24.entry_status & 0x3c);
                         comp_status = (uint16_t)LE_16(pkt->sts24.comp_status);
                         scsi_status_h = pkt->sts24.scsi_status_h;
                         scsi_status_l = pkt->sts24.scsi_status_l;

@@ -4233,19 +4352,19 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
                 rval = 0;
         } else {
-                QL_PRINT_9(CE_CONT, "(%d): LUN list\n", ha->instance);
+                QL_PRINT_9(ha, "LUN list\n");
                 QL_DUMP_9(rpt, 8, rpt->hdr.len + 8);
                 rval = (int)(BE_32(rpt->hdr.len) / 8);
         }
 
         kmem_free(pkt, pkt_size);
         ql_free_dma_resource(ha, &dma_mem);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -4269,11 +4388,11 @@
         int             lun, cnt, rval;
         ql_mbx_iocb_t   *pkt;
         uint8_t         *inq;
         uint32_t        pkt_size;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         pkt_size = sizeof (ql_mbx_iocb_t) + INQ_DATA_SIZE;
         pkt = kmem_zalloc(pkt_size, KM_SLEEP);
         if (pkt == NULL) {
                 EL(ha, "failed, kmem_zalloc\n");

@@ -4306,13 +4425,13 @@
                         case DTYPE_SEQUENTIAL:
                                 cnt++;
                                 tq->flags |= TQF_TAPE_DEVICE;
                                 break;
                         default:
-                                QL_PRINT_9(CE_CONT, "(%d): failed, "
+                                QL_PRINT_9(ha, "failed, "
                                     "unsupported device id=%xh, lun=%d, "
-                                    "type=%xh\n", ha->instance, tq->loop_id,
+                                    "type=%xh\n", tq->loop_id,
                                     lun, *inq);
                                 break;
                         }
 
                         if (*inq == DTYPE_ESI || cnt >= count) {

@@ -4324,11 +4443,11 @@
                 }
         }
 
         kmem_free(pkt, pkt_size);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (cnt);
 }
 
 /*

@@ -4348,20 +4467,22 @@
  * Context:
  *      Kernel context.
  */
 static int
 ql_inq(ql_adapter_state_t *ha, ql_tgt_t *tq, int lun, ql_mbx_iocb_t *pkt,
-    uint8_t inq_len)
+    uint32_t inq_len)
 {
         dma_mem_t       dma_mem;
         int             rval, retries;
         uint32_t        pkt_size, cnt;
         uint16_t        comp_status;
         uint8_t         scsi_status_h, scsi_status_l, *reqs;
         caddr_t         inq_data;
+        uint64_t        lun_addr;
+        fcp_ent_addr_t  *fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (DRIVER_SUSPENDED(ha)) {
                 EL(ha, "failed, loop down\n");
                 return (QL_FUNCTION_TIMEOUT);
         }

@@ -4372,23 +4493,39 @@
         inq_data = (caddr_t)pkt + sizeof (ql_mbx_iocb_t);
 
         /* Get DMA memory for the IOCB */
         if (ql_get_dma_mem(ha, &dma_mem, inq_len,
             LITTLE_ENDIAN_DMA, QL_DMA_RING_ALIGN) != QL_SUCCESS) {
-                cmn_err(CE_WARN, "%s(%d): DMA memory "
+                cmn_err(CE_WARN, "%s(%d) DMA memory "
                     "alloc failed", QL_NAME, ha->instance);
                 return (0);
         }
 
         for (retries = 0; retries < 4; retries++) {
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         pkt->cmd24.entry_type = IOCB_CMD_TYPE_7;
                         pkt->cmd24.entry_count = 1;
 
                         /* Set LUN number */
-                        pkt->cmd24.fcp_lun[2] = LSB(lun);
-                        pkt->cmd24.fcp_lun[3] = MSB(lun);
+                        lun_addr = ql_get_lun_addr(tq, lun);
+                        fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
+                        pkt->cmd24.fcp_lun[2] =
+                            lobyte(fcp_ent_addr->ent_addr_0);
+                        pkt->cmd24.fcp_lun[3] =
+                            hibyte(fcp_ent_addr->ent_addr_0);
+                        pkt->cmd24.fcp_lun[0] =
+                            lobyte(fcp_ent_addr->ent_addr_1);
+                        pkt->cmd24.fcp_lun[1] =
+                            hibyte(fcp_ent_addr->ent_addr_1);
+                        pkt->cmd24.fcp_lun[6] =
+                            lobyte(fcp_ent_addr->ent_addr_2);
+                        pkt->cmd24.fcp_lun[7] =
+                            hibyte(fcp_ent_addr->ent_addr_2);
+                        pkt->cmd24.fcp_lun[4] =
+                            lobyte(fcp_ent_addr->ent_addr_3);
+                        pkt->cmd24.fcp_lun[5] =
+                            hibyte(fcp_ent_addr->ent_addr_3);
 
                         /* Set N_port handle */
                         pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
 
                         /* Set target ID */

@@ -4402,11 +4539,11 @@
                         /* Set ISP command timeout. */
                         pkt->cmd24.timeout = LE_16(15);
 
                         /* Load SCSI CDB */
                         pkt->cmd24.scsi_cdb[0] = SCMD_INQUIRY;
-                        pkt->cmd24.scsi_cdb[4] = inq_len;
+                        pkt->cmd24.scsi_cdb[4] = LSB(LSW(inq_len));
                         for (cnt = 0; cnt < MAX_CMDSZ; cnt += 4) {
                                 ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
                                     + cnt, 4);
                         }
 

@@ -4421,15 +4558,15 @@
 
                         /* Load total byte count. */
                         pkt->cmd24.total_byte_count = LE_32(inq_len);
 
                         /* Load data descriptor. */
-                        pkt->cmd24.dseg_0_address[0] = (uint32_t)
+                        pkt->cmd24.dseg.address[0] = (uint32_t)
                             LE_32(LSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd24.dseg_0_address[1] = (uint32_t)
+                        pkt->cmd24.dseg.address[1] = (uint32_t)
                             LE_32(MSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd24.dseg_0_length = LE_32(inq_len);
+                        pkt->cmd24.dseg.length = LE_32(inq_len);
                 } else if (CFG_IST(ha, CFG_ENABLE_64BIT_ADDRESSING)) {
                         pkt->cmd3.entry_type = IOCB_CMD_TYPE_3;
                         cnt = CMD_TYPE_3_DATA_SEGMENTS;
 
                         pkt->cmd3.entry_count = 1;

@@ -4442,18 +4579,18 @@
                         pkt->cmd3.lun_l = LSB(lun);
                         pkt->cmd3.lun_h = MSB(lun);
                         pkt->cmd3.control_flags_l = CF_DATA_IN | CF_STAG;
                         pkt->cmd3.timeout = LE_16(15);
                         pkt->cmd3.scsi_cdb[0] = SCMD_INQUIRY;
-                        pkt->cmd3.scsi_cdb[4] = inq_len;
+                        pkt->cmd3.scsi_cdb[4] = LSB(LSW(inq_len));
                         pkt->cmd3.dseg_count = LE_16(1);
                         pkt->cmd3.byte_count = LE_32(inq_len);
-                        pkt->cmd3.dseg_0_address[0] = (uint32_t)
+                        pkt->cmd3.dseg[0].address[0] = (uint32_t)
                             LE_32(LSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd3.dseg_0_address[1] = (uint32_t)
+                        pkt->cmd3.dseg[0].address[1] = (uint32_t)
                             LE_32(MSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd3.dseg_0_length = LE_32(inq_len);
+                        pkt->cmd3.dseg[0].length = LE_32(inq_len);
                 } else {
                         pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
                         cnt = CMD_TYPE_2_DATA_SEGMENTS;
 
                         pkt->cmd.entry_count = 1;

@@ -4466,16 +4603,16 @@
                         pkt->cmd.lun_l = LSB(lun);
                         pkt->cmd.lun_h = MSB(lun);
                         pkt->cmd.control_flags_l = CF_DATA_IN | CF_STAG;
                         pkt->cmd.timeout = LE_16(15);
                         pkt->cmd.scsi_cdb[0] = SCMD_INQUIRY;
-                        pkt->cmd.scsi_cdb[4] = inq_len;
+                        pkt->cmd.scsi_cdb[4] = LSB(LSW(inq_len));
                         pkt->cmd.dseg_count = LE_16(1);
                         pkt->cmd.byte_count = LE_32(inq_len);
-                        pkt->cmd.dseg_0_address = (uint32_t)
+                        pkt->cmd.dseg[0].address = (uint32_t)
                             LE_32(LSD(dma_mem.cookie.dmac_laddress));
-                        pkt->cmd.dseg_0_length = LE_32(inq_len);
+                        pkt->cmd.dseg[0].length = LE_32(inq_len);
                 }
 
 /*              rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size); */
                 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
                     sizeof (ql_mbx_iocb_t));

@@ -4485,11 +4622,11 @@
                     DDI_DMA_SYNC_FORKERNEL);
                 /* Copy in coming DMA data. */
                 ddi_rep_get8(dma_mem.acc_handle, (uint8_t *)inq_data,
                     (uint8_t *)dma_mem.bp, dma_mem.size, DDI_DEV_AUTOINCR);
 
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         pkt->sts24.entry_status = (uint8_t)
                             (pkt->sts24.entry_status & 0x3c);
                         comp_status = (uint16_t)LE_16(pkt->sts24.comp_status);
                         scsi_status_h = pkt->sts24.scsi_status_h;
                         scsi_status_l = pkt->sts24.scsi_status_l;

@@ -4540,11 +4677,11 @@
                         break;
                 }
         }
         ql_free_dma_resource(ha, &dma_mem);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -4568,11 +4705,11 @@
 {
         uint32_t        cnt;
 
         for (cnt = 0; cnt < size; cnt++) {
                 if (ddi_copyin(src++, dst++, 1, mode) != 0) {
-                        QL_PRINT_2(CE_CONT, "failed, ddi_copyin\n");
+                        QL_PRINT_2(NULL, "failed, ddi_copyin\n");
                         break;
                 }
         }
 
         return (cnt);

@@ -4599,11 +4736,11 @@
 {
         uint32_t        cnt;
 
         for (cnt = 0; cnt < size; cnt++) {
                 if (ddi_copyout(src++, dst++, 1, mode) != 0) {
-                        QL_PRINT_2(CE_CONT, "failed, ddi_copyin\n");
+                        QL_PRINT_2(NULL, "failed, ddi_copyin\n");
                         break;
                 }
         }
 
         return (cnt);

@@ -4689,14 +4826,14 @@
         uint16_t        chksum, *bp, data;
         int             rval;
         flash_desc_t    *fdesc;
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (ha->flash_desc_addr == 0) {
-                QL_PRINT_9(CE_CONT, "(%d): desc ptr=0\n", ha->instance);
+                QL_PRINT_9(ha, "desc ptr=0\n");
                 return (QL_FUNCTION_FAILED);
         }
 
         if ((fdesc = kmem_zalloc(sizeof (flash_desc_t), KM_SLEEP)) == NULL) {
                 EL(ha, "kmem_zalloc=null\n");

@@ -4741,11 +4878,11 @@
         }
 
         bcopy(fdesc, &xp->fdesc, sizeof (flash_desc_t));
         kmem_free(fdesc, sizeof (flash_desc_t));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (QL_SUCCESS);
 }
 
 /*

@@ -4770,20 +4907,22 @@
 
         if (xp->fdesc.flash_size != 0) {
                 return (rval);
         }
 
-        if (CFG_IST(ha, CFG_CTRL_2200) && !ha->subven_id) {
+        if (CFG_IST(ha, CFG_CTRL_22XX) && !ha->subven_id) {
                 return (QL_FUNCTION_FAILED);
         }
 
-        if (CFG_IST(ha, CFG_CTRL_258081)) {
+        if (CFG_IST(ha, CFG_CTRL_252780818283)) {
                 /*
                  * Temporarily set the ha->xioctl->fdesc.flash_size to
                  * 25xx flash size to avoid failing of ql_dump_focde.
                  */
-                if (CFG_IST(ha, CFG_CTRL_8021)) {
+                if (CFG_IST(ha, CFG_CTRL_278083)) {
+                        ha->xioctl->fdesc.flash_size = 0x1000000;
+                } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
                         ha->xioctl->fdesc.flash_size = 0x800000;
                 } else if (CFG_IST(ha, CFG_CTRL_25XX)) {
                         ha->xioctl->fdesc.flash_size = 0x200000;
                 } else {
                         ha->xioctl->fdesc.flash_size = 0x400000;

@@ -4791,19 +4930,19 @@
 
                 if (ql_24xx_flash_desc(ha) == QL_SUCCESS) {
                         EL(ha, "flash desc table ok, exit\n");
                         return (rval);
                 }
-                if (CFG_IST(ha, CFG_CTRL_8021)) {
-                        xp->fdesc.flash_manuf = WINBOND_FLASH;
-                        xp->fdesc.flash_id = WINBOND_FLASHID;
+                if (CFG_IST(ha, CFG_CTRL_82XX)) {
+                        xp->fdesc.flash_manuf = MXIC_FLASH;
+                        xp->fdesc.flash_id = MXIC_FLASHID_25LXX;
                         xp->fdesc.flash_len = 0x17;
                 } else {
                         (void) ql_24xx_flash_id(ha);
                 }
 
-        } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+        } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
                 (void) ql_24xx_flash_id(ha);
         } else {
                 ql_flash_enable(ha);
 
                 ql_write_flash_byte(ha, 0x5555, 0xaa);

@@ -4835,17 +4974,24 @@
         /* Default flash descriptor table. */
         xp->fdesc.write_statusreg_cmd = 1;
         xp->fdesc.write_enable_bits = 0;
         xp->fdesc.unprotect_sector_cmd = 0;
         xp->fdesc.protect_sector_cmd = 0;
-        xp->fdesc.write_disable_bits = 0x9c;
+        xp->fdesc.write_disable_bits = 0xbc;
         xp->fdesc.block_size = 0x10000;
         xp->fdesc.erase_cmd = 0xd8;
 
         switch (xp->fdesc.flash_manuf) {
         case AMD_FLASH:
                 switch (xp->fdesc.flash_id) {
+                case SPAN_FLASHID_16384K:
+                        if (xp->fdesc.flash_len == 0x18) {
+                                xp->fdesc.flash_size = 0x1000000;
+                        } else {
+                                rval = QL_FUNCTION_FAILED;
+                        }
+                        break;
                 case SPAN_FLASHID_2048K:
                         xp->fdesc.flash_size = 0x200000;
                         break;
                 case AMD_FLASHID_1024K:
                         xp->fdesc.flash_size = 0x100000;

@@ -4882,10 +5028,17 @@
                                 xp->fdesc.flash_size = 0x200000;
                         } else {
                                 rval = QL_FUNCTION_FAILED;
                         }
                         break;
+                case ST_FLASHID_N25QXXX:
+                        if (xp->fdesc.flash_len == 0x18) {
+                                xp->fdesc.flash_size = 0x1000000;
+                        } else {
+                                rval = QL_FUNCTION_FAILED;
+                        }
+                        break;
                 default:
                         rval = QL_FUNCTION_FAILED;
                         break;
                 }
                 break;

@@ -4918,14 +5071,21 @@
                         break;
                 case MXIC_FLASHID_1024K:
                         xp->fdesc.flash_size = 0x100000;
                         break;
                 case MXIC_FLASHID_25LXX:
+                        xp->fdesc.write_disable_bits = 0xbc;
                         if (xp->fdesc.flash_len == 0x14) {
                                 xp->fdesc.flash_size = 0x100000;
                         } else if (xp->fdesc.flash_len == 0x15) {
                                 xp->fdesc.flash_size = 0x200000;
+                        } else if (xp->fdesc.flash_len == 0x16) {
+                                xp->fdesc.flash_size = 0x400000;
+                        } else if (xp->fdesc.flash_len == 0x17) {
+                                xp->fdesc.flash_size = 0x800000;
+                        } else if (xp->fdesc.flash_len == 0x18) {
+                                xp->fdesc.flash_size = 0x1000000;
                         } else {
                                 rval = QL_FUNCTION_FAILED;
                         }
                         break;
                 default:

@@ -4953,10 +5113,12 @@
                                 xp->fdesc.flash_size = 0x200000;
                         } else if (xp->fdesc.flash_len == 0x16) {
                                 xp->fdesc.flash_size = 0x400000;
                         } else if (xp->fdesc.flash_len == 0x17) {
                                 xp->fdesc.flash_size = 0x800000;
+                        } else if (xp->fdesc.flash_len == 0x18) {
+                                xp->fdesc.flash_size = 0x1000000;
                         } else {
                                 rval = QL_FUNCTION_FAILED;
                         }
                         break;
                 default:

@@ -4980,25 +5142,39 @@
                 default:
                         rval = QL_FUNCTION_FAILED;
                         break;
                 }
                 break;
+        case EON_FLASH:
+                switch (xp->fdesc.flash_id) {
+                case EON_FLASHID_EN25QXXX:
+                        if (xp->fdesc.flash_len == 0x18) {
+                                xp->fdesc.flash_size = 0x1000000;
+                        } else {
+                                rval = QL_FUNCTION_FAILED;
+                        }
+                        break;
         default:
                 rval = QL_FUNCTION_FAILED;
                 break;
         }
+                break;
+        default:
+                rval = QL_FUNCTION_FAILED;
+                break;
+        }
 
         /* Try flash table later. */
-        if (rval != QL_SUCCESS && CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (rval != QL_SUCCESS && CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 EL(ha, "no default id\n");
                 return (QL_SUCCESS);
         }
 
         /*
-         * hack for non std 2312 and 6312 boards. hardware people need to
-         * use either the 128k flash chip (original), or something larger.
-         * For driver purposes, we'll treat it as a 128k flash chip.
+         * hack for non std 2312/2322 and 6312/6322 boards. hardware people
+         * need to use either the 128k flash chip (original), or something
+         * larger. For driver purposes, we'll treat it as a 128k flash chip.
          */
         if ((ha->device_id == 0x2312 || ha->device_id == 0x6312 ||
             ha->device_id == 0x2322 || ha->device_id == 0x6322) &&
             (xp->fdesc.flash_size > 0x20000) &&
             (CFG_IST(ha, CFG_SBUS_CARD) ==  0)) {

@@ -5040,11 +5216,11 @@
 {
         uint8_t         *bfp;
         ql_xioctl_t     *xp = ha->xioctl;
         int             rval = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (bsize > xp->fdesc.flash_size) {
                 EL(ha, "failed, bufsize: %xh, flash size: %xh\n", bsize,
                     xp->fdesc.flash_size);
                 return (ENOMEM);

@@ -5066,11 +5242,11 @@
                         rval = 0;
                 }
                 kmem_free(bfp, bsize);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -5093,15 +5269,15 @@
 ql_load_fcode(ql_adapter_state_t *ha, uint8_t *dp, uint32_t size, uint32_t addr)
 {
         uint32_t        cnt;
         int             rval;
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 return (ql_24xx_load_flash(ha, dp, size, addr));
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (CFG_IST(ha, CFG_SBUS_CARD)) {
                 /*
                  * sbus has an additional check to make
                  * sure they don't brick the HBA.

@@ -5139,11 +5315,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
         return (rval);
 }
 
 /*

@@ -5168,11 +5344,11 @@
 {
         uint8_t         *bfp;
         int             rval;
         ql_xioctl_t     *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* adjust max read size to flash size */
         if (bsize > xp->fdesc.flash_size) {
                 EL(ha, "adjusting req=%xh, max=%xh\n", bsize,
                     xp->fdesc.flash_size);

@@ -5196,11 +5372,11 @@
                         rval = 0;
                 }
                 kmem_free(bfp, bsize);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -5227,20 +5403,20 @@
         uint32_t        cnt, data, addr;
         uint8_t         bp[4], *src;
         int             fp_rval, rval = QL_SUCCESS;
         dma_mem_t       mem;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* make sure startpos+size doesn't exceed flash */
         if (size + startpos > ha->xioctl->fdesc.flash_size) {
                 EL(ha, "exceeded flash range, sz=%xh, stp=%xh, flsz=%xh\n",
                     size, startpos, ha->xioctl->fdesc.flash_size);
                 return (QL_FUNCTION_PARAMETER_ERROR);
         }
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 /* check start addr is 32 bit aligned for 24xx */
                 if ((startpos & 0x3) != 0) {
                         rval = ql_24xx_read_flash(ha,
                             ha->flash_data_addr | startpos >> 2, &data);
                         if (rval != QL_SUCCESS) {

@@ -5255,11 +5431,11 @@
                                 *dp++ = bp[startpos & 0x3];
                                 startpos++;
                                 size--;
                         }
                         if (size == 0) {
-                                QL_PRINT_9(CE_CONT, "(%d): done2\n",
+                                QL_PRINT_9(ha, "done2\n",
                                     ha->instance);
                                 return (rval);
                         }
                 }
 

@@ -5268,11 +5444,11 @@
         }
 
         bzero(&mem, sizeof (dma_mem_t));
         /* Check for Fast page is supported */
         if ((ha->pha->task_daemon_flags & FIRMWARE_UP) &&
-            (CFG_IST(ha, CFG_CTRL_2581))) {
+            (CFG_IST(ha, CFG_FLASH_DMA_SUPPORT))) {
                 fp_rval = QL_SUCCESS;
                 /* Setup DMA buffer. */
                 rval = ql_get_dma_mem(ha, &mem, size,
                     LITTLE_ENDIAN_DMA, QL_DMA_DATA_ALIGN);
                 if (rval != QL_SUCCESS) {

@@ -5285,21 +5461,21 @@
         }
 
         GLOBAL_HW_LOCK();
 
         /* Enable Flash Read/Write. */
-        if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 ql_flash_enable(ha);
         }
 
         /* Read fcode data from flash. */
         while (size) {
                 /* Allow other system activity. */
                 if (size % 0x1000 == 0) {
-                        ql_delay(ha, 100000);
+                        ql_delay(ha, 10000);
                 }
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         if (fp_rval == QL_SUCCESS && (addr & 0x3f) == 0) {
                                 cnt = (size + 3) >> 2;
                                 fp_rval = ql_rd_risc_ram(ha, addr,
                                     mem.cookie.dmac_laddress, cnt);
                                 if (fp_rval == QL_SUCCESS) {

@@ -5326,11 +5502,11 @@
                         *dp++ = (uint8_t)ql_read_flash_byte(ha, startpos++);
                         size--;
                 }
         }
 
-        if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 ql_flash_disable(ha);
         }
 
         GLOBAL_HW_UNLOCK();
 

@@ -5340,11 +5516,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval = %xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
         return (rval);
 }
 
 /*

@@ -5402,11 +5578,11 @@
 {
         EXT_SET_RNID_REQ        tmp_set;
         EXT_RNID_DATA           *tmp_buf;
         int                     rval = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (DRIVER_SUSPENDED(ha)) {
                 EL(ha, "failed, LOOP_NOT_READY\n");
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->ResponseLen = 0;

@@ -5467,11 +5643,11 @@
                 cmd->ResponseLen = 0;
         }
 
         kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_rnid_parameters
  *      Get RNID parameters.

@@ -5485,11 +5661,11 @@
 ql_get_rnid_parameters(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_RNID_DATA   *tmp_buf;
         uint32_t        rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (DRIVER_SUSPENDED(ha)) {
                 EL(ha, "failed, LOOP_NOT_READY\n");
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->ResponseLen = 0;

@@ -5523,11 +5699,11 @@
             sizeof (EXT_RNID_DATA), mode) != sizeof (EXT_RNID_DATA)) {
                 EL(ha, "failed, ddi_copyout\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
         } else {
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
                 cmd->ResponseLen = sizeof (EXT_RNID_DATA);
         }
 
         kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
 }

@@ -5550,11 +5726,11 @@
 ql_reset_statistics(ql_adapter_state_t *ha, EXT_IOCTL *cmd)
 {
         ql_xioctl_t             *xp = ha->xioctl;
         int                     rval = 0;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (DRIVER_SUSPENDED(ha)) {
                 EL(ha, "failed, LOOP_NOT_READY\n");
                 cmd->Status = EXT_STATUS_BUSY;
                 cmd->ResponseLen = 0;

@@ -5586,11 +5762,11 @@
         xp->DeviceErrorCount = 0;
         xp->TotalLipResets = 0;
         xp->TotalInterrupts = 0;
         INTR_UNLOCK(ha);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -5615,11 +5791,11 @@
         ql_link_stats_t         *ls;
         int                     rval;
         ql_xioctl_t             *xp = ha->xioctl;
         int                     retry = 10;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         while (ha->task_daemon_flags &
             (ABORT_ISP_ACTIVE | LOOP_RESYNC_ACTIVE | DRIVER_STALL)) {
                 ql_delay(ha, 10000000); /* 10 second delay */
 

@@ -5683,11 +5859,11 @@
                 }
         }
 
         kmem_free(ls, sizeof (ql_link_stats_t));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_statistics_fc
  *      Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.

@@ -5713,11 +5889,11 @@
         EXT_DEST_ADDR           pextdestaddr;
         uint8_t                 *name;
         ql_tgt_t                *tq = NULL;
         int                     retry = 10;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
             (void *)&pextdestaddr, sizeof (EXT_DEST_ADDR), mode) != 0) {
                 EL(ha, "failed, ddi_copyin\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;

@@ -5726,11 +5902,11 @@
         }
 
         qlnt = QLNT_PORT;
         name = pextdestaddr.DestAddr.WWPN;
 
-        QL_PRINT_9(CE_CONT, "(%d): wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
+        QL_PRINT_9(ha, "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
             ha->instance, name[0], name[1], name[2], name[3], name[4],
             name[5], name[6], name[7]);
 
         tq = ql_find_port(ha, name, qlnt);
 

@@ -5793,11 +5969,11 @@
                 }
         }
 
         kmem_free(ls, sizeof (ql_link_stats_t));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_statistics_fc4
  *      Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.

@@ -5818,11 +5994,11 @@
 {
         uint32_t                rval;
         EXT_HBA_FC4STATISTICS   fc4stats = {0};
         ql_xioctl_t             *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         fc4stats.InputRequests = xp->IOInputRequests;
         fc4stats.OutputRequests = xp->IOOutputRequests;
         fc4stats.ControlRequests = xp->IOControlRequests;
         fc4stats.InputMegabytes = xp->IOInputMByteCnt;

@@ -5838,11 +6014,11 @@
                 cmd->ResponseLen = 0;
         } else {
                 cmd->ResponseLen = sizeof (EXT_HBA_FC4STATISTICS);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_set_led_state
  *      Performs EXT_SET_BEACON_STATE subcommand of EXT_CC_SET_DATA.

@@ -5860,14 +6036,14 @@
  */
 static void
 ql_set_led_state(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_BEACON_CONTROL      bstate;
-        uint32_t                rval;
-        ql_xioctl_t             *xp = ha->xioctl;
+        int                     rval;
+        ql_mbx_data_t           mr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->RequestLen < sizeof (EXT_BEACON_CONTROL)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_BEACON_CONTROL);
                 EL(ha, "done - failed, RequestLen < EXT_BEACON_CONTROL,"

@@ -5874,11 +6050,11 @@
                     " Len=%xh\n", cmd->RequestLen);
                 cmd->ResponseLen = 0;
                 return;
         }
 
-        if (ha->device_id < 0x2300) {
+        if (!CFG_IST(ha, CFG_SET_LEDS_SUPPORT)) {
                 cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
                 cmd->DetailStatus = 0;
                 EL(ha, "done - failed, Invalid function for HBA model\n");
                 cmd->ResponseLen = 0;
                 return;

@@ -5893,56 +6069,88 @@
                 return;
         }
 
         switch (bstate.State) {
         case EXT_DEF_GRN_BLINK_OFF:     /* turn beacon off */
-                if (xp->ledstate.BeaconState == BEACON_OFF) {
+                if (ha->ledstate.BeaconState == BEACON_OFF) {
                         /* not quite an error -- LED state is already off */
                         cmd->Status = EXT_STATUS_OK;
                         EL(ha, "LED off request -- LED is already off\n");
                         break;
                 }
 
-                xp->ledstate.BeaconState = BEACON_OFF;
-                xp->ledstate.LEDflags = LED_ALL_OFF;
+                if (CFG_IST(ha, CFG_CTRL_82XX)) {
+                        rval = ql_diag_beacon(ha, QL_BEACON_DISABLE,
+                            &mr);
 
+                        if (rval == QL_SUCCESS) {
+                                ha->ledstate.BeaconState = BEACON_OFF;
+                                ha->ledstate.LEDflags = LED_ALL_OFF;
+                                cmd->Status = EXT_STATUS_OK;
+                        } else {
+                                cmd->Status = EXT_STATUS_ERR;
+                                EL(ha, "failed, disable beacon request %xh\n",
+                                    bstate.State);
+                        }
+                        break;
+                }
+
+                ha->ledstate.BeaconState = BEACON_OFF;
+                ha->ledstate.LEDflags = LED_ALL_OFF;
+
                 if ((rval = ql_wrapup_led(ha)) != QL_SUCCESS) {
                         cmd->Status = EXT_STATUS_MAILBOX;
                 } else {
                         cmd->Status = EXT_STATUS_OK;
                 }
                 break;
 
         case EXT_DEF_GRN_BLINK_ON:      /* turn beacon on */
-                if (xp->ledstate.BeaconState == BEACON_ON) {
+                if (ha->ledstate.BeaconState == BEACON_ON) {
                         /* not quite an error -- LED state is already on */
                         cmd->Status = EXT_STATUS_OK;
                         EL(ha, "LED on request  - LED is already on\n");
                         break;
                 }
 
+                if (CFG_IST(ha, CFG_CTRL_82XX)) {
+                        rval = ql_diag_beacon(ha, QL_BEACON_ENABLE,
+                            &mr);
+
+                        if (rval == QL_SUCCESS) {
+                                ha->ledstate.BeaconState = BEACON_ON;
+                                ha->ledstate.LEDflags = LED_GREEN;
+                                cmd->Status = EXT_STATUS_OK;
+                        } else {
+                                cmd->Status = EXT_STATUS_ERR;
+                                EL(ha, "failed, enable beacon request %xh\n",
+                                    bstate.State);
+                        }
+                        break;
+                }
+
                 if ((rval = ql_setup_led(ha)) != QL_SUCCESS) {
                         cmd->Status = EXT_STATUS_MAILBOX;
                         break;
                 }
 
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                        xp->ledstate.LEDflags = LED_YELLOW_24 | LED_AMBER_24;
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                        ha->ledstate.LEDflags = LED_YELLOW_24 | LED_AMBER_24;
                 } else {
-                        xp->ledstate.LEDflags = LED_GREEN;
+                        ha->ledstate.LEDflags = LED_GREEN;
                 }
-                xp->ledstate.BeaconState = BEACON_ON;
+                ha->ledstate.BeaconState = BEACON_ON;
 
                 cmd->Status = EXT_STATUS_OK;
                 break;
         default:
                 cmd->Status = EXT_STATUS_ERR;
                 EL(ha, "failed, unknown state request %xh\n", bstate.State);
                 break;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_led_state
  *      Performs EXT_GET_BEACON_STATE subcommand of EXT_CC_GET_DATA.

@@ -5961,13 +6169,12 @@
 static void
 ql_get_led_state(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_BEACON_CONTROL      bstate = {0};
         uint32_t                rval;
-        ql_xioctl_t             *xp = ha->xioctl;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (cmd->ResponseLen < sizeof (EXT_BEACON_CONTROL)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_BEACON_CONTROL);
                 EL(ha, "done - failed, ResponseLen < EXT_BEACON_CONTROL,"

@@ -5974,11 +6181,11 @@
                     "Len=%xh\n", cmd->ResponseLen);
                 cmd->ResponseLen = 0;
                 return;
         }
 
-        if (ha->device_id < 0x2300) {
+        if (!CFG_IST(ha, CFG_SET_LEDS_SUPPORT)) {
                 cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
                 cmd->DetailStatus = 0;
                 EL(ha, "done - failed, Invalid function for HBA model\n");
                 cmd->ResponseLen = 0;
                 return;

@@ -5990,11 +6197,11 @@
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* inform the user of the current beacon state (off or on) */
-        bstate.State = xp->ledstate.BeaconState;
+        bstate.State = ha->ledstate.BeaconState;
 
         rval = ddi_copyout((void *)&bstate,
             (void *)(uintptr_t)cmd->ResponseAdr,
             sizeof (EXT_BEACON_CONTROL), mode);
 

@@ -6005,11 +6212,11 @@
         } else {
                 cmd->Status = EXT_STATUS_OK;
                 cmd->ResponseLen = sizeof (EXT_BEACON_CONTROL);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_blink_led
  *      Determine the next state of the LED and drive it

@@ -6022,29 +6229,82 @@
  */
 void
 ql_blink_led(ql_adapter_state_t *ha)
 {
         uint32_t                nextstate;
-        ql_xioctl_t             *xp = ha->xioctl;
+        ql_mbx_data_t   mr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (xp->ledstate.BeaconState == BEACON_ON) {
+        if (ha->ledstate.BeaconState == BEACON_ON) {
+                if (CFG_IST(ha, CFG_CTRL_2363 | CFG_CTRL_2425)) {
                 /* determine the next led state */
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                        nextstate = (xp->ledstate.LEDflags) &
+                        if (CFG_IST(ha, CFG_CTRL_2425)) {
+                                nextstate = (ha->ledstate.LEDflags) &
                             (~(RD32_IO_REG(ha, gpiod)));
                 } else {
-                        nextstate = (xp->ledstate.LEDflags) &
+                                nextstate = (ha->ledstate.LEDflags) &
                             (~(RD16_IO_REG(ha, gpiod)));
                 }
 
                 /* turn the led on or off */
                 ql_drive_led(ha, nextstate);
+                } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
+                        if (ha->ledstate.flags & LED_ACTIVE) {
+                                mr.mb[1] = 0x2000;
+                                mr.mb[2] = 0x4000;
+                                ha->ledstate.flags &= ~LED_ACTIVE;
+                        } else {
+                                mr.mb[1] = 0x4000;
+                                mr.mb[2] = 0x2000;
+                                ha->ledstate.flags |= LED_ACTIVE;
         }
+                        (void) ql_set_led_config(ha, &mr);
+                } else if (CFG_IST(ha, CFG_CTRL_80XX)) {
+                        if (ha->ledstate.flags & LED_ACTIVE) {
+                                mr.mb[1] = 0x4000;
+                                mr.mb[2] = 0x2000;
+                                mr.mb[3] = 0x4000;
+                                mr.mb[4] = 0x4000;
+                                mr.mb[5] = 0;
+                                mr.mb[6] = 0x2000;
+                                (void) ql_set_led_config(ha, &mr);
+                                ha->ledstate.flags &= ~LED_ACTIVE;
+                        } else {
+                                mr.mb[1] = 0x4000;
+                                mr.mb[2] = 0x4000;
+                                mr.mb[3] = 0x4000;
+                                mr.mb[4] = 0x2000;
+                                mr.mb[5] = 0;
+                                mr.mb[6] = 0x2000;
+                                (void) ql_set_led_config(ha, &mr);
+                                ha->ledstate.flags |= LED_ACTIVE;
+                        }
+                } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+                        if (ha->ledstate.flags & LED_ACTIVE) {
+                                (void) ql_write_remote_reg(ha,
+                                    ha->ledstate.select,
+                                    0x40004000);
+                                (void) ql_write_remote_reg(ha,
+                                    ha->ledstate.select + 4,
+                                    0x40004000);
+                                ha->ledstate.flags &= ~LED_ACTIVE;
+                        } else {
+                                (void) ql_write_remote_reg(ha,
+                                    ha->ledstate.select,
+                                    0x40002000);
+                                (void) ql_write_remote_reg(ha,
+                                    ha->ledstate.select + 4,
+                                    0x40002000);
+                                ha->ledstate.flags |= LED_ACTIVE;
+                        }
+                } else if (!CFG_IST(ha, CFG_CTRL_27XX)) {
+                        EL(ha, "unsupported HBA: %xh\n", ha->device_id);
+                }
+        }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_drive_led
  *      drive the led's as determined by LEDflags

@@ -6057,15 +6317,14 @@
  *      Kernel/Interrupt context.
  */
 static void
 ql_drive_led(ql_adapter_state_t *ha, uint32_t LEDflags)
 {
+        QL_PRINT_9(ha, "started\n");
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        if (CFG_IST(ha, CFG_CTRL_2363)) {
 
-        if (CFG_IST(ha, (CFG_CTRL_2300 | CFG_CTRL_6322))) {
-
                 uint16_t        gpio_enable, gpio_data;
 
                 /* setup to send new data */
                 gpio_enable = (uint16_t)RD16_IO_REG(ha, gpioe);
                 gpio_enable = (uint16_t)(gpio_enable | LED_MASK);

@@ -6079,12 +6338,11 @@
                 gpio_data = (uint16_t)(gpio_data | LEDflags);
 
                 /* write out the new led data */
                 WRT16_IO_REG(ha, gpiod, gpio_data);
 
-        } else if (CFG_IST(ha, CFG_CTRL_24258081)) {
-
+        } else if (CFG_IST(ha, CFG_CTRL_2425)) {
                 uint32_t        gpio_data;
 
                 /* setup to send new data */
                 gpio_data = RD32_IO_REG(ha, gpiod);
                 gpio_data |= LED_MASK_UPDATE_24;

@@ -6099,14 +6357,14 @@
 
                 /* write out the new led data */
                 WRT32_IO_REG(ha, gpiod, gpio_data);
 
         } else {
-                EL(ha, "unsupported HBA: %xh", ha->device_id);
+                EL(ha, "unsupported HBA: %xh\n", ha->device_id);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_setup_led
  *      Setup LED for driver control

@@ -6115,18 +6373,19 @@
  *      ha:     adapter state pointer.
  *
  * Context:
  *      Kernel/Interrupt context.
  */
-static uint32_t
+static int
 ql_setup_led(ql_adapter_state_t *ha)
 {
-        uint32_t        rval;
+        int             rval = QL_SUCCESS;
         ql_mbx_data_t   mr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
+        if (CFG_IST(ha, CFG_CTRL_2363 | CFG_CTRL_2425)) {
         /* decouple the LED control from the fw */
         rval = ql_get_firmware_option(ha, &mr);
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, get_firmware_option=%xh\n", rval);
                 return (rval);

@@ -6143,13 +6402,84 @@
         }
 
         /* initally, turn the LED's off */
         ql_drive_led(ha, LED_ALL_OFF);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
+                (void) ql_get_led_config(ha, &ha->ledstate.cfg);
+                mr.mb[1] = 0x2000;
+                mr.mb[2] = 0x2000;
+                rval = ql_set_led_config(ha, &mr);
 
+        } else if (CFG_IST(ha, CFG_CTRL_80XX)) {
+                /* Save initial value */
+                rval = ql_get_led_config(ha, &ha->ledstate.cfg);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, get_led_config=%xh\n", rval);
         return (rval);
+                }
+                mr.mb[1] = 0x4000;
+                mr.mb[2] = 0x4000;
+                mr.mb[3] = 0x4000;
+                mr.mb[4] = 0x2000;
+                mr.mb[5] = 0;
+                mr.mb[6] = 0x2000;
+                rval = ql_set_led_config(ha, &mr);
+
+        } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+                rval = ql_get_firmware_option(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, get_firmware_option=%xh\n", rval);
+                        return (rval);
+                }
+
+                mr.mb[1] = (uint16_t)(mr.mb[1] | FO1_DISABLE_LEDS);
+
+                rval = ql_set_firmware_option(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, set_firmware_option=%xh\n", rval);
+                        return (rval);
+                }
+
+                (void) ql_write_remote_reg(ha, ha->ledstate.select,
+                    0x40002000);
+                (void) ql_write_remote_reg(ha, ha->ledstate.select + 4,
+                    0x40002000);
+
+        } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                /* take control of LED */
+                rval = ql_get_firmware_option(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, get_firmware_option=%xh\n", rval);
+                        return (rval);
+                }
+
+                mr.mb[1] = (uint16_t)(mr.mb[1] | FO1_DISABLE_LEDS);
+
+                rval = ql_set_firmware_option(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, set_firmware_option=%xh\n", rval);
+                        return (rval);
+                }
+
+                mr.mb[1] = 0xf;
+                mr.mb[2] = 0x230;
+                mr.mb[3] = 0x230;
+                mr.mb[4] = 0x4000;
+                rval = ql_led_config(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, led_config=%xh\n", rval);
+                        return (rval);
+                }
+        } else {
+                EL(ha, "unsupported HBA: %xh\n", ha->device_id);
+        }
+        ha->ledstate.flags |= LED_ACTIVE;
+
+        QL_PRINT_9(ha, "done\n");
+
+        return (rval);
 }
 
 /*
  * ql_wrapup_led
  *      Return LED control to the firmware

@@ -6158,50 +6488,72 @@
  *      ha:     adapter state pointer.
  *
  * Context:
  *      Kernel/Interrupt context.
  */
-static uint32_t
+static int
 ql_wrapup_led(ql_adapter_state_t *ha)
 {
-        uint32_t        rval;
+        int             rval = QL_SUCCESS;
         ql_mbx_data_t   mr;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        /* Turn all LED's off */
-        ql_drive_led(ha, LED_ALL_OFF);
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-
+        if (CFG_IST(ha, CFG_CTRL_2363 | CFG_CTRL_2425)) {
                 uint32_t        gpio_data;
 
+                /* Turn all LED's off */
+                ql_drive_led(ha, LED_ALL_OFF);
+
+                if (CFG_IST(ha, CFG_CTRL_2425)) {
                 /* disable the LED update mask */
                 gpio_data = RD32_IO_REG(ha, gpiod);
                 gpio_data &= ~LED_MASK_UPDATE_24;
 
                 /* write out the data */
                 WRT32_IO_REG(ha, gpiod, gpio_data);
+                        /* give LED control back to the f/w */
         }
+                rval = ql_get_firmware_option(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, get_firmware_option=%xh\n", rval);
+                        return (rval);
+                }
 
+                mr.mb[1] = (uint16_t)(mr.mb[1] & ~FO1_DISABLE_GPIO);
+
+                rval = ql_set_firmware_option(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        EL(ha, "failed, set_firmware_option=%xh\n", rval);
+                        return (rval);
+                }
+        } else if (CFG_IST(ha, CFG_CTRL_8081)) {
+                rval = ql_set_led_config(ha, &ha->ledstate.cfg);
+
+        } else if (CFG_IST(ha, CFG_CTRL_2783)) {
         /* give LED control back to the f/w */
         rval = ql_get_firmware_option(ha, &mr);
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, get_firmware_option=%xh\n", rval);
                 return (rval);
         }
 
-        mr.mb[1] = (uint16_t)(mr.mb[1] & ~FO1_DISABLE_GPIO);
+                mr.mb[1] = (uint16_t)(mr.mb[1] & ~FO1_DISABLE_LEDS);
 
         rval = ql_set_firmware_option(ha, &mr);
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, set_firmware_option=%xh\n", rval);
                 return (rval);
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        } else {
+                EL(ha, "unsupported HBA: %xh\n", ha->device_id);
+        }
 
+        QL_PRINT_9(ha, "done\n");
+
         return (rval);
 }
 
 /*
  * ql_get_port_summary

@@ -6230,11 +6582,11 @@
         ql_tgt_t                *tq;
         uint32_t                rlen, dev_type, index;
         int                     rval = 0;
         EXT_DEVICEDATAENTRY     *uddep, *ddep;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         ddep = &dd.EntryList[0];
 
         /*
          * Get the type of device the requestor is looking for.

@@ -6289,11 +6641,12 @@
         for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
                 for (link = ha->dev[index].first; link != NULL;
                     link = link->next) {
                         tq = link->base_address;
                         if (tq->flags & TQF_INITIATOR_DEVICE ||
-                            !VALID_TARGET_ID(ha, tq->loop_id)) {
+                            !VALID_TARGET_ID(ha, tq->loop_id) ||
+                            tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
                                 continue;       /* Skip this one */
                         }
 
                         bzero((void *)ddep, sizeof (EXT_DEVICEDATAENTRY));
 

@@ -6307,11 +6660,11 @@
                         bcopy(tq->port_name,
                             (caddr_t)&ddep->TargetAddress.Target, 8);
 
                         ddep->DeviceFlags = tq->flags;
                         ddep->LoopID = tq->loop_id;
-                        QL_PRINT_9(CE_CONT, "(%d): Tgt=%lld, loop=%xh, "
+                        QL_PRINT_9(ha, "Tgt=%lld, loop=%xh, "
                             "wwnn=%02x%02x%02x%02x%02x%02x%02x%02x, "
                             "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
                             ha->instance, ddep->TargetAddress.Target,
                             ddep->LoopID, ddep->NodeWWN[0], ddep->NodeWWN[1],
                             ddep->NodeWWN[2], ddep->NodeWWN[3],

@@ -6343,11 +6696,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout-2\n");
         } else {
                 cmd->ResponseLen += (uint32_t)sizeof (EXT_DEVICEDATAENTRY);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_get_target_id

@@ -6372,11 +6725,11 @@
         EXT_DEST_ADDR           extdestaddr = {0};
         uint8_t                 *name;
         uint8_t                 wwpn[EXT_DEF_WWN_NAME_SIZE];
         ql_tgt_t                *tq;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
             (void*)wwpn, sizeof (EXT_DEST_ADDR), mode) != 0) {
                 EL(ha, "failed, ddi_copyin\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;

@@ -6384,11 +6737,11 @@
                 return;
         }
 
         qlnt = QLNT_PORT;
         name = wwpn;
-        QL_PRINT_9(CE_CONT, "(%d): wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
+        QL_PRINT_9(ha, "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
             ha->instance, name[0], name[1], name[2], name[3], name[4],
             name[5], name[6], name[7]);
 
         tq = ql_find_port(ha, name, qlnt);
         if (tq == NULL || !VALID_TARGET_ID(ha, tq->loop_id)) {

@@ -6406,11 +6759,11 @@
                 EL(ha, "failed, ddi_copyout\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_setup_fcache
  *      Populates selected flash sections into the cache

@@ -6436,25 +6789,21 @@
         uint32_t        fw_done = 0;
         ql_fcache_t     *head = NULL;
         ql_fcache_t     *tail = NULL;
         ql_fcache_t     *ftmp;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_10(ha, "started cfg=0x%llx\n", ha->cfg_flags);
 
-        CACHE_LOCK(ha);
-
         /* If we already have populated it, rtn */
         if (ha->fcache != NULL) {
-                CACHE_UNLOCK(ha);
                 EL(ha, "buffer already populated\n");
                 return (QL_SUCCESS);
         }
 
         ql_flash_nvram_defaults(ha);
 
         if ((rval = ql_setup_flash(ha)) != QL_SUCCESS) {
-                CACHE_UNLOCK(ha);
                 EL(ha, "unable to setup flash; rval=%xh\n", rval);
                 return (rval);
         }
 
         while (freadpos != 0xffffffff) {

@@ -6473,11 +6822,11 @@
                         tail = ftmp;
                 }
 
                 /* Do the firmware node first for 24xx/25xx's */
                 if (fw_done == 0) {
-                        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                                 freadpos = ha->flash_fw_addr << 2;
                         }
                         fw_done = 1;
                 }
 

@@ -6508,13 +6857,12 @@
                 }
 
                 EL(ha, "failed, done\n");
         } else {
                 ha->fcache = head;
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_10(ha, "done\n");
         }
-        CACHE_UNLOCK(ha);
 
         return (rval);
 }
 
 /*

@@ -6541,11 +6889,11 @@
         uint32_t        fw_done = 0;
         ql_fcache_t     *head = NULL;
         ql_fcache_t     *tail = NULL;
         ql_fcache_t     *ftmp;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         while (freadpos != 0xffffffff) {
 
                 /* Allocate & populate this node */
 

@@ -6563,24 +6911,24 @@
                         tail = ftmp;
                 }
 
                 /* Do the firmware node first for 24xx's */
                 if (fw_done == 0) {
-                        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                                 freadpos = ha->flash_fw_addr << 2;
                         }
                         fw_done = 1;
                 }
 
                 /* read in first FBUFSIZE bytes of this flash section */
-                if (freadpos+FBUFSIZE > bsize) {
+                if (freadpos + FBUFSIZE > bsize) {
                         EL(ha, "passed buffer too small; fr=%xh, bsize=%xh\n",
                             freadpos, bsize);
                         rval = QL_FUNCTION_FAILED;
                         break;
                 }
-                bcopy(bfp+freadpos, ftmp->buf, FBUFSIZE);
+                bcopy(bfp + freadpos, ftmp->buf, FBUFSIZE);
 
                 /* checkout the pci data / format */
                 if (ql_check_pci(ha, ftmp, &freadpos)) {
                         EL(ha, "flash header incorrect\n");
                         rval = QL_FUNCTION_FAILED;

@@ -6596,16 +6944,14 @@
                 EL(ha, "failed, done\n");
         } else {
                 /*
                  * Release previous fcache resources and update with new
                  */
-                CACHE_LOCK(ha);
                 ql_fcache_rel(ha->fcache);
                 ha->fcache = head;
-                CACHE_UNLOCK(ha);
 
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 }
 
 /*
  * ql_setup_fnode

@@ -6689,11 +7035,11 @@
 {
         uint32_t                len;
         ql_link_t               *link;
         ql_adapter_state_t      *ha2;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         /* Get base path length. */
         for (len = (uint32_t)strlen(ha->devpath); len; len--) {
                 if (ha->devpath[len] == ',' ||
                     ha->devpath[len] == '@') {

@@ -6707,26 +7053,24 @@
 
                 if (strncmp(ha->devpath, ha2->devpath, len) != 0) {
                         continue;
                 }
 
-                CACHE_LOCK(ha2);
                 ql_fcache_rel(ha2->fcache);
                 ha2->fcache = NULL;
 
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         if (ha2->vcache != NULL) {
                                 kmem_free(ha2->vcache, QL_24XX_VPD_SIZE);
                                 ha2->vcache = NULL;
                         }
                 }
-                CACHE_UNLOCK(ha2);
 
                 (void) ql_setup_fcache(ha2);
         }
 
-        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_3(ha, "done\n");
 }
 
 /*
  * ql_get_fbuf
  *      Search the fcache list for the type specified

@@ -6782,11 +7126,11 @@
         pci_header_t    *pcih;
         pci_data_t      *pcid;
         uint32_t        doff;
         uint8_t         *pciinfo;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if (fcache != NULL) {
                 pciinfo = fcache->buf;
         } else {
                 EL(ha, "failed, null fcache ptr passed\n");

@@ -6819,12 +7163,11 @@
                         kmem_free(bufp, len);
                 }
 
                 *nextpos = 0xffffffff;
 
-                QL_PRINT_9(CE_CONT, "(%d): CFG_SBUS_CARD, done\n",
-                    ha->instance);
+                QL_PRINT_3(ha, "CFG_SBUS_CARD, done\n");
 
                 return (0);
         }
 
         if (*nextpos == ha->flash_fw_addr << 2) {

@@ -6869,20 +7212,14 @@
 
                 (void) snprintf(fcache->verstr, FCHBA_OPTION_ROM_VERSION_LEN,
                     "%d.%02d.%02d", fcache->buf[19], fcache->buf[23],
                     fcache->buf[27]);
 
-                if (CFG_IST(ha, CFG_CTRL_81XX)) {
-                        *nextpos = 0x200000;
-                } else if (CFG_IST(ha, CFG_CTRL_8021)) {
-                        *nextpos = 0x80000;
-                } else {
-                        *nextpos = 0;
-                }
+                *nextpos = ha->boot_code_addr << 2;
                 kmem_free(buf, FBUFSIZE);
 
-                QL_PRINT_9(CE_CONT, "(%d): FTYPE_FW, done\n", ha->instance);
+                QL_PRINT_3(ha, "FTYPE_FW, done\n");
 
                 return (0);
         }
 
         /* get to the pci header image length */

@@ -6906,12 +7243,12 @@
                 EL(ha, "failed, data sig mismatch!\n");
                 return (1);
         }
 
         if (pcid->indicator == PCI_IND_LAST_IMAGE) {
-                QL_PRINT_9(CE_CONT, "(%d): last image\n", ha->instance);
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                QL_PRINT_3(ha, "last image\n");
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         ql_flash_layout_table(ha, *nextpos +
                             (pcid->imagelength[0] | (pcid->imagelength[1] <<
                             8)) * PCI_SECTOR_SIZE);
                         (void) ql_24xx_flash_desc(ha);
                 }

@@ -6941,11 +7278,11 @@
         }
 
         (void) snprintf(fcache->verstr, FCHBA_OPTION_ROM_VERSION_LEN,
             "%d.%02d", pcid->revisionlevel[1], pcid->revisionlevel[0]);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_3(ha, "done\n");
 
         return (0);
 }
 
 /*

@@ -6966,11 +7303,11 @@
         uint8_t         *bp;
         int             rval;
         uint32_t        len, faddr, cnt;
         uint16_t        chksum, w16;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Process flash layout table header */
         len = sizeof (ql_flt_ptr_t);
         if ((bp = kmem_zalloc(len, KM_SLEEP)) == NULL) {
                 EL(ha, "kmem_zalloc=null\n");

@@ -6991,11 +7328,12 @@
                 w16 = (uint16_t)CHAR_TO_SHORT(bp[cnt], bp[cnt + 1]);
                 chksum += w16;
         }
         if (chksum != 0 || fptr->sig[0] != 'Q' || fptr->sig[1] != 'F' ||
             fptr->sig[2] != 'L' || fptr->sig[3] != 'T') {
-                EL(ha, "ptr chksum=%xh, sig=%c%c%c%c\n", chksum, fptr->sig[0],
+                EL(ha, "ptr chksum=%xh, sig=%c%c%c%c \n",
+                    chksum, fptr->sig[0],
                     fptr->sig[1], fptr->sig[2], fptr->sig[3]);
                 kmem_free(bp, len);
                 return;
         }
         faddr = CHAR_TO_LONG(fptr->addr[0], fptr->addr[1], fptr->addr[2],

@@ -7003,11 +7341,11 @@
 
         kmem_free(bp, len);
 
         ql_process_flt(ha, faddr);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_process_flt
  *      Obtains flash addresses from flash layout table

@@ -7027,11 +7365,11 @@
         uint8_t         *bp, *eaddr, nv_rg, vpd_rg;
         int             rval;
         uint32_t        len, cnt, fe_addr;
         uint16_t        chksum, w16;
 
-        QL_PRINT_9(CE_CONT, "(%d): started faddr=%xh\n", ha->instance, faddr);
+        QL_PRINT_9(ha, "started faddr=%xh\n", faddr);
 
         /* Process flash layout table header */
         if ((bp = kmem_zalloc(FLASH_LAYOUT_TABLE_SIZE, KM_SLEEP)) == NULL) {
                 EL(ha, "kmem_zalloc=null\n");
                 return;

@@ -7065,11 +7403,11 @@
         }
         eaddr = bp + len;
 
         /* Process Function/Port Configuration Map. */
         nv_rg = vpd_rg = 0;
-        if (CFG_IST(ha, CFG_CTRL_8021)) {
+        if (CFG_IST(ha, CFG_CTRL_82XX)) {
                 uint16_t        i;
                 uint8_t         *mbp = eaddr;
                 ql_fp_cfg_map_t *cmp = (ql_fp_cfg_map_t *)mbp;
 
                 len = (uint32_t)(CHAR_TO_SHORT(cmp->hdr.len[0],

@@ -7088,11 +7426,11 @@
                     cmp->hdr.Signature[0] != 'F' ||
                     cmp->hdr.Signature[1] != 'P' ||
                     cmp->hdr.Signature[2] != 'C' ||
                     cmp->hdr.Signature[3] != 'M') {
                         EL(ha, "cfg_map chksum=%xh, version=%d, "
-                            "sig=%c%c%c%c\n", chksum, w16,
+                            "sig=%c%c%c%c \n", chksum, w16,
                             cmp->hdr.Signature[0], cmp->hdr.Signature[1],
                             cmp->hdr.Signature[2], cmp->hdr.Signature[3]);
                 } else {
                         cnt = (uint16_t)
                             (CHAR_TO_SHORT(cmp->hdr.NumberEntries[0],

@@ -7099,11 +7437,11 @@
                             cmp->hdr.NumberEntries[1]));
                         /* Locate entry for function. */
                         for (i = 0; i < cnt; i++) {
                                 if (cmp->cfg[i].FunctionType == FT_FC &&
                                     cmp->cfg[i].FunctionNumber[0] ==
-                                    ha->function_number &&
+                                    ha->pci_function_number &&
                                     cmp->cfg[i].FunctionNumber[1] == 0) {
                                         nv_rg = cmp->cfg[i].ConfigRegion;
                                         vpd_rg = cmp->cfg[i].VpdRegion;
                                         break;
                                 }

@@ -7129,127 +7467,127 @@
 
                 switch (frgn->region) {
                 case FLASH_8021_BOOTLOADER_REGION:
                         ha->bootloader_addr = faddr;
                         ha->bootloader_size = (fe_addr - faddr) + 1;
-                        QL_PRINT_9(CE_CONT, "(%d): bootloader_addr=%xh, "
-                            "size=%xh\n", ha->instance, faddr,
+                        QL_PRINT_9(ha, "bootloader_addr=%xh, "
+                            "size=%xh\n", faddr,
                             ha->bootloader_size);
                         break;
                 case FLASH_FW_REGION:
                 case FLASH_8021_FW_REGION:
                         ha->flash_fw_addr = faddr;
                         ha->flash_fw_size = (fe_addr - faddr) + 1;
-                        QL_PRINT_9(CE_CONT, "(%d): flash_fw_addr=%xh, "
-                            "size=%xh\n", ha->instance, faddr,
+                        QL_PRINT_9(ha, "flash_fw_addr=%xh, "
+                            "size=%xh\n", faddr,
                             ha->flash_fw_size);
                         break;
                 case FLASH_GOLDEN_FW_REGION:
                 case FLASH_8021_GOLDEN_FW_REGION:
                         ha->flash_golden_fw_addr = faddr;
-                        QL_PRINT_9(CE_CONT, "(%d): flash_golden_fw_addr=%xh\n",
+                        QL_PRINT_9(ha, "flash_golden_fw_addr=%xh\n",
                             ha->instance, faddr);
                         break;
                 case FLASH_8021_VPD_REGION:
                         if (!vpd_rg || vpd_rg == FLASH_8021_VPD_REGION) {
                                 ha->flash_vpd_addr = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): 8021_flash_vpd_"
-                                    "addr=%xh\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "8021_flash_vpd_"
+                                    "addr=%xh\n", faddr);
                         }
                         break;
                 case FLASH_VPD_0_REGION:
                         if (vpd_rg) {
                                 if (vpd_rg == FLASH_VPD_0_REGION) {
                                         ha->flash_vpd_addr = faddr;
-                                        QL_PRINT_9(CE_CONT, "(%d): vpd_rg  "
+                                        QL_PRINT_9(ha, "vpd_rg  "
                                             "flash_vpd_addr=%xh\n",
                                             ha->instance, faddr);
                                 }
-                        } else if (!(ha->flags & FUNCTION_1) &&
-                            !(CFG_IST(ha, CFG_CTRL_8021))) {
+                        } else if (ha->function_number == 0 &&
+                            !(CFG_IST(ha, CFG_CTRL_82XX))) {
                                 ha->flash_vpd_addr = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_vpd_addr=%xh"
-                                    "\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_vpd_addr=%xh"
+                                    "\n", faddr);
                         }
                         break;
                 case FLASH_NVRAM_0_REGION:
                         if (nv_rg) {
                                 if (nv_rg == FLASH_NVRAM_0_REGION) {
                                         ADAPTER_STATE_LOCK(ha);
-                                        ha->flags &= ~FUNCTION_1;
+                                        ha->function_number = 0;
                                         ADAPTER_STATE_UNLOCK(ha);
                                         ha->flash_nvram_addr = faddr;
-                                        QL_PRINT_9(CE_CONT, "(%d): nv_rg "
+                                        QL_PRINT_9(ha, "nv_rg "
                                             "flash_nvram_addr=%xh\n",
                                             ha->instance, faddr);
                                 }
-                        } else if (!(ha->flags & FUNCTION_1)) {
+                        } else if (ha->function_number == 0) {
                                 ha->flash_nvram_addr = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_nvram_addr="
-                                    "%xh\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_nvram_addr="
+                                    "%xh\n", faddr);
                         }
                         break;
                 case FLASH_VPD_1_REGION:
                         if (vpd_rg) {
                                 if (vpd_rg == FLASH_VPD_1_REGION) {
                                         ha->flash_vpd_addr = faddr;
-                                        QL_PRINT_9(CE_CONT, "(%d): vpd_rg "
+                                        QL_PRINT_9(ha, "vpd_rg "
                                             "flash_vpd_addr=%xh\n",
                                             ha->instance, faddr);
                                 }
-                        } else if (ha->flags & FUNCTION_1 &&
-                            !(CFG_IST(ha, CFG_CTRL_8021))) {
+                        } else if (ha->function_number &&
+                            !(CFG_IST(ha, CFG_CTRL_82XX))) {
                                 ha->flash_vpd_addr = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_vpd_addr=%xh"
-                                    "\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_vpd_addr=%xh"
+                                    "\n", faddr);
                         }
                         break;
                 case FLASH_NVRAM_1_REGION:
                         if (nv_rg) {
                                 if (nv_rg == FLASH_NVRAM_1_REGION) {
                                         ADAPTER_STATE_LOCK(ha);
-                                        ha->flags |= FUNCTION_1;
+                                        ha->function_number = 1;
                                         ADAPTER_STATE_UNLOCK(ha);
                                         ha->flash_nvram_addr = faddr;
-                                        QL_PRINT_9(CE_CONT, "(%d): nv_rg "
+                                        QL_PRINT_9(ha, "nv_rg "
                                             "flash_nvram_addr=%xh\n",
                                             ha->instance, faddr);
                                 }
-                        } else if (ha->flags & FUNCTION_1) {
+                        } else if (ha->function_number) {
                                 ha->flash_nvram_addr = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_nvram_addr="
-                                    "%xh\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_nvram_addr="
+                                    "%xh\n", faddr);
                         }
                         break;
                 case FLASH_DESC_TABLE_REGION:
-                        if (!(CFG_IST(ha, CFG_CTRL_8021))) {
+                        if (!(CFG_IST(ha, CFG_CTRL_82XX))) {
                                 ha->flash_desc_addr = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_desc_addr="
-                                    "%xh\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_desc_addr="
+                                    "%xh\n", faddr);
                         }
                         break;
                 case FLASH_ERROR_LOG_0_REGION:
-                        if (!(ha->flags & FUNCTION_1)) {
+                        if (ha->function_number == 0) {
                                 ha->flash_errlog_start = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_errlog_addr="
-                                    "%xh\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_errlog_addr="
+                                    "%xh\n", faddr);
                         }
                         break;
                 case FLASH_ERROR_LOG_1_REGION:
-                        if (ha->flags & FUNCTION_1) {
+                        if (ha->function_number) {
                                 ha->flash_errlog_start = faddr;
-                                QL_PRINT_9(CE_CONT, "(%d): flash_errlog_addr="
-                                    "%xh\n", ha->instance, faddr);
+                                QL_PRINT_9(ha, "flash_errlog_addr="
+                                    "%xh\n", faddr);
                         }
                         break;
                 default:
                         break;
                 }
         }
         kmem_free(bp, FLASH_LAYOUT_TABLE_SIZE);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_flash_nvram_defaults
  *      Flash default addresses.

@@ -7264,93 +7602,181 @@
  *      Kernel context.
  */
 static void
 ql_flash_nvram_defaults(ql_adapter_state_t *ha)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_10(ha, "started\n");
 
-        if (ha->flags & FUNCTION_1) {
-                if (CFG_IST(ha, CFG_CTRL_2300)) {
+        if (ha->function_number == 3) {
+                if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                        ha->flash_nvram_addr = NVRAM_2700_FUNC3_ADDR;
+                        ha->flash_vpd_addr = VPD_2700_FUNC3_ADDR;
+                        ha->ledstate.select = BEACON_2700_FUNC3_ADDR;
+                        ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+                        ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+                        ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+                        ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+                        ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
+                } else {
+                        EL(ha, "unassigned flash fn%d addr: %x\n",
+                            ha->function_number, ha->device_id);
+                }
+        } else if (ha->function_number == 2) {
+                if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                        ha->flash_nvram_addr = NVRAM_2700_FUNC2_ADDR;
+                        ha->flash_vpd_addr = VPD_2700_FUNC2_ADDR;
+                        ha->ledstate.select = BEACON_2700_FUNC2_ADDR;
+                        ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+                        ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+                        ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+                        ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+                        ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
+                } else {
+                        EL(ha, "unassigned flash fn%d addr: %x\n",
+                            ha->function_number, ha->device_id);
+                }
+        } else if (ha->function_number == 1) {
+                if (CFG_IST(ha, CFG_CTRL_23XX) ||
+                    (CFG_IST(ha, CFG_CTRL_63XX))) {
                         ha->flash_nvram_addr = NVRAM_2300_FUNC1_ADDR;
                         ha->flash_fw_addr = FLASH_2300_FIRMWARE_ADDR;
-                } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+                        ha->boot_code_addr = FLASH_2300_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
                         ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
                         ha->flash_nvram_addr = NVRAM_2400_FUNC1_ADDR;
                         ha->flash_vpd_addr = VPD_2400_FUNC1_ADDR;
                         ha->flash_errlog_start = FLASH_2400_ERRLOG_START_ADDR_1;
                         ha->flash_desc_addr = FLASH_2400_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_2400_FIRMWARE_ADDR;
+                        ha->boot_code_addr = FLASH_2400_BOOT_CODE_ADDR;
                 } else if (CFG_IST(ha, CFG_CTRL_25XX)) {
                         ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
                         ha->flash_nvram_addr = NVRAM_2500_FUNC1_ADDR;
                         ha->flash_vpd_addr = VPD_2500_FUNC1_ADDR;
                         ha->flash_errlog_start = FLASH_2500_ERRLOG_START_ADDR_1;
                         ha->flash_desc_addr = FLASH_2500_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_2500_FIRMWARE_ADDR;
+                        ha->boot_code_addr = FLASH_2500_BOOT_CODE_ADDR;
                 } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
                         ha->flash_data_addr = FLASH_8100_DATA_ADDR;
                         ha->flash_nvram_addr = NVRAM_8100_FUNC1_ADDR;
                         ha->flash_vpd_addr = VPD_8100_FUNC1_ADDR;
                         ha->flash_errlog_start = FLASH_8100_ERRLOG_START_ADDR_1;
                         ha->flash_desc_addr = FLASH_8100_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_8100_FIRMWARE_ADDR;
-                } else if (CFG_IST(ha, CFG_CTRL_8021)) {
+                        ha->boot_code_addr = FLASH_8100_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
                         ha->flash_data_addr = 0;
                         ha->flash_nvram_addr = NVRAM_8021_FUNC1_ADDR;
                         ha->flash_vpd_addr = VPD_8021_FUNC1_ADDR;
                         ha->flash_errlog_start = 0;
                         ha->flash_desc_addr = FLASH_8021_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_8021_FIRMWARE_ADDR;
                         ha->flash_fw_size = FLASH_8021_FIRMWARE_SIZE;
                         ha->bootloader_addr = FLASH_8021_BOOTLOADER_ADDR;
                         ha->bootloader_size = FLASH_8021_BOOTLOADER_SIZE;
-                }
+                        ha->boot_code_addr = FLASH_8021_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+                        ha->flash_nvram_addr = NVRAM_8300_FC_FUNC1_ADDR;
+                        ha->flash_vpd_addr = VPD_8300_FC_FUNC1_ADDR;
+                        ha->ledstate.select = BEACON_8300_FC_FUNC1_ADDR;
+                        ha->flash_errlog_start = FLASH_8300_ERRLOG_START_ADDR_1;
+                        ha->flash_data_addr = FLASH_8300_DATA_ADDR;
+                        ha->flash_desc_addr = FLASH_8300_DESCRIPTOR_TABLE;
+                        ha->flash_fw_addr = FLASH_8300_FC_FIRMWARE_ADDR;
+                        ha->flash_fw_size = FLASH_8300_FIRMWARE_SIZE;
+                        ha->bootloader_addr = FLASH_8300_BOOTLOADER_ADDR;
+                        ha->bootloader_size = FLASH_8300_BOOTLOADER_SIZE;
+                        ha->boot_code_addr = FLASH_8300_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                        ha->flash_nvram_addr = NVRAM_2700_FUNC1_ADDR;
+                        ha->flash_vpd_addr = VPD_2700_FUNC1_ADDR;
+                        ha->ledstate.select = BEACON_2700_FUNC1_ADDR;
+                        ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+                        ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+                        ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+                        ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+                        ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
         } else {
-                if (CFG_IST(ha, CFG_CTRL_2200)) {
+                        EL(ha, "unassigned flash fn%d addr: %x\n",
+                            ha->function_number, ha->device_id);
+                }
+        } else if (ha->function_number == 0) {
+                if (CFG_IST(ha, CFG_CTRL_22XX)) {
                         ha->flash_nvram_addr = NVRAM_2200_FUNC0_ADDR;
                         ha->flash_fw_addr = FLASH_2200_FIRMWARE_ADDR;
-                } else if (CFG_IST(ha, CFG_CTRL_2300) ||
-                    (CFG_IST(ha, CFG_CTRL_6322))) {
+                        ha->boot_code_addr = FLASH_2200_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_23XX) ||
+                    (CFG_IST(ha, CFG_CTRL_63XX))) {
                         ha->flash_nvram_addr = NVRAM_2300_FUNC0_ADDR;
                         ha->flash_fw_addr = FLASH_2300_FIRMWARE_ADDR;
-                } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+                        ha->boot_code_addr = FLASH_2300_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
                         ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
                         ha->flash_nvram_addr = NVRAM_2400_FUNC0_ADDR;
                         ha->flash_vpd_addr = VPD_2400_FUNC0_ADDR;
                         ha->flash_errlog_start = FLASH_2400_ERRLOG_START_ADDR_0;
                         ha->flash_desc_addr = FLASH_2400_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_2400_FIRMWARE_ADDR;
+                        ha->boot_code_addr = FLASH_2400_BOOT_CODE_ADDR;
                 } else if (CFG_IST(ha, CFG_CTRL_25XX)) {
                         ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
                         ha->flash_nvram_addr = NVRAM_2500_FUNC0_ADDR;
                         ha->flash_vpd_addr = VPD_2500_FUNC0_ADDR;
                         ha->flash_errlog_start = FLASH_2500_ERRLOG_START_ADDR_0;
                         ha->flash_desc_addr = FLASH_2500_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_2500_FIRMWARE_ADDR;
+                        ha->boot_code_addr = FLASH_2500_BOOT_CODE_ADDR;
                 } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
                         ha->flash_data_addr = FLASH_8100_DATA_ADDR;
                         ha->flash_nvram_addr = NVRAM_8100_FUNC0_ADDR;
                         ha->flash_vpd_addr = VPD_8100_FUNC0_ADDR;
                         ha->flash_errlog_start = FLASH_8100_ERRLOG_START_ADDR_0;
                         ha->flash_desc_addr = FLASH_8100_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_8100_FIRMWARE_ADDR;
-                } else if (CFG_IST(ha, CFG_CTRL_8021)) {
+                        ha->boot_code_addr = FLASH_8100_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
                         ha->flash_data_addr = 0;
                         ha->flash_nvram_addr = NVRAM_8021_FUNC0_ADDR;
                         ha->flash_vpd_addr = VPD_8021_FUNC0_ADDR;
                         ha->flash_errlog_start = 0;
                         ha->flash_desc_addr = FLASH_8021_DESCRIPTOR_TABLE;
                         ha->flash_fw_addr = FLASH_8021_FIRMWARE_ADDR;
                         ha->flash_fw_size = FLASH_8021_FIRMWARE_SIZE;
                         ha->bootloader_addr = FLASH_8021_BOOTLOADER_ADDR;
                         ha->bootloader_size = FLASH_8021_BOOTLOADER_SIZE;
+                        ha->boot_code_addr = FLASH_8021_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+                        ha->flash_nvram_addr = NVRAM_8300_FC_FUNC0_ADDR;
+                        ha->flash_vpd_addr = VPD_8300_FC_FUNC0_ADDR;
+                        ha->ledstate.select = BEACON_8300_FCOE_FUNC0_ADDR;
+                        ha->flash_errlog_start = FLASH_8300_ERRLOG_START_ADDR_0;
+                        ha->flash_data_addr = FLASH_8300_DATA_ADDR;
+                        ha->flash_desc_addr = FLASH_8300_DESCRIPTOR_TABLE;
+                        ha->flash_fw_addr = FLASH_8300_FC_FIRMWARE_ADDR;
+                        ha->flash_fw_size = FLASH_8300_FIRMWARE_SIZE;
+                        ha->bootloader_addr = FLASH_8300_BOOTLOADER_ADDR;
+                        ha->bootloader_size = FLASH_8300_BOOTLOADER_SIZE;
+                        ha->boot_code_addr = FLASH_8300_BOOT_CODE_ADDR;
+                } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                        ha->flash_nvram_addr = NVRAM_2700_FUNC0_ADDR;
+                        ha->flash_vpd_addr = VPD_2700_FUNC0_ADDR;
+                        ha->ledstate.select = BEACON_2700_FUNC0_ADDR;
+                        ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+                        ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+                        ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+                        ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+                        ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
                 } else {
-                        EL(ha, "unassigned flash fn0 addr: %x\n",
-                            ha->device_id);
+                        EL(ha, "unassigned flash fn%d addr: %x\n",
+                            ha->function_number, ha->device_id);
                 }
+        } else {
+                EL(ha, "known function=%d, device_id=%x\n",
+                    ha->function_number, ha->device_id);
         }
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_10(ha, "done\n");
 }
 
 /*
  * ql_get_sfp
  *      Returns sfp data to sdmapi caller

@@ -7367,13 +7793,13 @@
  *      Kernel context.
  */
 static void
 ql_get_sfp(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 EL(ha, "failed, invalid request for HBA\n");
                 return;
         }
 

@@ -7392,11 +7818,11 @@
                 EL(ha, "failed, copy error\n");
         } else {
                 cmd->Status = EXT_STATUS_OK;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_dump_sfp
  *      Dumps SFP.

@@ -7417,11 +7843,11 @@
         dma_mem_t       mem;
         uint32_t        cnt;
         int             rval2, rval = 0;
         uint32_t        dxfer;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* Get memory for SFP. */
 
         if ((rval2 = ql_get_dma_mem(ha, &mem, 64, LITTLE_ENDIAN_DMA,
             QL_DMA_DATA_ALIGN)) != QL_SUCCESS) {

@@ -7452,11 +7878,11 @@
                 bp = (caddr_t)bp + mem.size;
         }
 
         ql_free_phys(ha, &mem);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -7482,13 +7908,13 @@
         ql_tgt_t                *tq;
         EXT_PORT_PARAM          port_param = {0};
         uint32_t                rval = QL_SUCCESS;
         uint32_t                idma_rate;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_242581) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 EL(ha, "invalid request for this HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -7516,16 +7942,17 @@
                 return;
         }
 
         name = port_param.FCScsiAddr.DestAddr.WWPN;
 
-        QL_PRINT_9(CE_CONT, "(%d): wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
+        QL_PRINT_9(ha, "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
             ha->instance, name[0], name[1], name[2], name[3], name[4],
             name[5], name[6], name[7]);
 
         tq = ql_find_port(ha, name, (uint16_t)QLNT_PORT);
-        if (tq == NULL || !VALID_TARGET_ID(ha, tq->loop_id)) {
+        if (tq == NULL || !VALID_TARGET_ID(ha, tq->loop_id) ||
+            tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
                 EL(ha, "failed, fc_port not found\n");
                 cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -7566,10 +7993,18 @@
                                 break;
                         case IIDMA_RATE_10GB:
                                 port_param.Speed =
                                     EXT_DEF_PORTSPEED_10GBIT;
                                 break;
+                        case IIDMA_RATE_16GB:
+                                port_param.Speed =
+                                    EXT_DEF_PORTSPEED_16GBIT;
+                                break;
+                        case IIDMA_RATE_32GB:
+                                port_param.Speed =
+                                    EXT_DEF_PORTSPEED_32GBIT;
+                                break;
                         default:
                                 port_param.Speed =
                                     EXT_DEF_PORTSPEED_UNKNOWN;
                                 EL(ha, "failed, Port speed rate=%xh\n",
                                     idma_rate);

@@ -7608,12 +8043,18 @@
                         break;
                 case EXT_DEF_PORTSPEED_8GBIT:
                         idma_rate = IIDMA_RATE_8GB;
                         break;
                 case EXT_DEF_PORTSPEED_10GBIT:
-                        port_param.Speed = IIDMA_RATE_10GB;
+                        idma_rate = IIDMA_RATE_10GB;
                         break;
+                case EXT_DEF_PORTSPEED_16GBIT:
+                        idma_rate = IIDMA_RATE_16GB;
+                        break;
+                case EXT_DEF_PORTSPEED_32GBIT:
+                        idma_rate = IIDMA_RATE_32GB;
+                        break;
                 default:
                         EL(ha, "invalid set iidma rate: %x\n",
                             port_param.Speed);
                         cmd->Status = EXT_STATUS_INVALID_PARAM;
                         cmd->ResponseLen = 0;

@@ -7638,11 +8079,11 @@
                 cmd->ResponseLen = 0;
                 cmd->DetailStatus = 0;
                 break;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_fwexttrace
  *      Dumps f/w extended trace buffer

@@ -7662,13 +8103,13 @@
 ql_get_fwexttrace(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         int     rval;
         caddr_t payload;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 EL(ha, "invalid request for this HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -7689,21 +8130,23 @@
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Time Stamp */
-        rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_INSERT_TIME_STAMP);
+        rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_INSERT_TIME_STAMP,
+            NULL);
         if (rval != QL_SUCCESS) {
                 EL(ha, "f/w extended trace insert"
                     "time stamp failed: %xh\n", rval);
                 cmd->Status = EXT_STATUS_ERR;
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Disable Tracing */
-        rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_EXT_TRACE_DISABLE);
+        rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_EXT_TRACE_DISABLE,
+            NULL);
         if (rval != QL_SUCCESS) {
                 EL(ha, "f/w extended trace disable failed: %xh\n", rval);
                 cmd->Status = EXT_STATUS_ERR;
                 cmd->ResponseLen = 0;
                 return;

@@ -7737,11 +8180,11 @@
                 cmd->Status = EXT_STATUS_OK;
         }
 
         kmem_free(payload, FWEXTSIZE);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_fwfcetrace
  *      Dumps f/w fibre channel event trace buffer

@@ -7759,15 +8202,19 @@
 /* ARGSUSED */
 static void
 ql_get_fwfcetrace(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         int     rval;
-        caddr_t payload;
+        caddr_t                 fce_trace_p;
+        ql_mbx_data_t           mr;
+        EXT_FW_FCE_TRACE        *fce_trace;
+        size_t                  cnt;
+        uint32_t                *bp;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
                 EL(ha, "invalid request for this HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -7788,49 +8235,87 @@
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Disable Tracing */
-        rval = ql_fw_etrace(ha, &ha->fwfcetracebuf, FTO_FCE_TRACE_DISABLE);
+        rval = ql_fw_etrace(ha, &ha->fwfcetracebuf, FTO_FCE_TRACE_DISABLE, &mr);
         if (rval != QL_SUCCESS) {
                 EL(ha, "f/w FCE trace disable failed: %xh\n", rval);
                 cmd->Status = EXT_STATUS_ERR;
                 cmd->ResponseLen = 0;
                 return;
         }
 
         /* Allocate payload buffer */
-        payload = kmem_zalloc(FWEXTSIZE, KM_SLEEP);
-        if (payload == NULL) {
+        fce_trace = kmem_zalloc(FWFCESIZE, KM_SLEEP);
+        if (fce_trace == NULL) {
                 EL(ha, "failed, kmem_zalloc\n");
                 cmd->Status = EXT_STATUS_NO_MEMORY;
                 cmd->ResponseLen = 0;
                 return;
         }
+        fce_trace_p = (caddr_t)&fce_trace->TraceData[0];
 
+        /* Copy In Ponter and Base Pointer values */
+        fce_trace->Registers[0] = mr.mb[2];
+        fce_trace->Registers[1] = mr.mb[3];
+        fce_trace->Registers[2] = mr.mb[4];
+        fce_trace->Registers[3] = mr.mb[5];
+
+        fce_trace->Registers[4] = LSW(ha->fwexttracebuf.cookies->dmac_address);
+        fce_trace->Registers[5] = MSW(ha->fwexttracebuf.cookies->dmac_address);
+        fce_trace->Registers[6] = LSW(ha->fwexttracebuf.cookies->dmac_notused);
+        fce_trace->Registers[7] = MSW(ha->fwexttracebuf.cookies->dmac_notused);
+
+        /* Copy FCE Trace Enable Registers */
+        fce_trace->Registers[8] = ha->fw_fce_trace_enable.mb[0];
+        fce_trace->Registers[9] = ha->fw_fce_trace_enable.mb[2];
+        fce_trace->Registers[10] = ha->fw_fce_trace_enable.mb[3];
+        fce_trace->Registers[11] = ha->fw_fce_trace_enable.mb[4];
+        fce_trace->Registers[12] = ha->fw_fce_trace_enable.mb[5];
+        fce_trace->Registers[13] = ha->fw_fce_trace_enable.mb[6];
+
         /* Sync DMA buffer. */
         (void) ddi_dma_sync(ha->fwfcetracebuf.dma_handle, 0,
             FWFCESIZE, DDI_DMA_SYNC_FORKERNEL);
 
         /* Copy trace buffer data. */
-        ddi_rep_get8(ha->fwfcetracebuf.acc_handle, (uint8_t *)payload,
+        ddi_rep_get8(ha->fwfcetracebuf.acc_handle, (uint8_t *)fce_trace_p,
             (uint8_t *)ha->fwfcetracebuf.bp, FWFCESIZE,
             DDI_DEV_AUTOINCR);
 
+        /* Swap bytes in buffer in case of Big Endian */
+        bp = (uint32_t *)&fce_trace->TraceData[0];
+        for (cnt = 0; cnt < (FWFCESIZE / sizeof (uint32_t)); cnt++) {
+                LITTLE_ENDIAN_32(bp);
+                bp++;
+        }
+
         /* Send payload to application. */
-        if (ql_send_buffer_data(payload, (caddr_t)(uintptr_t)cmd->ResponseAdr,
+        if (ql_send_buffer_data((caddr_t)fce_trace,
+            (caddr_t)(uintptr_t)cmd->ResponseAdr,
             cmd->ResponseLen, mode) != cmd->ResponseLen) {
                 EL(ha, "failed, send_buffer_data\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
         } else {
                 cmd->Status = EXT_STATUS_OK;
         }
 
-        kmem_free(payload, FWFCESIZE);
+        /* Re-enable Tracing */
+        bzero(ha->fwfcetracebuf.bp, ha->fwfcetracebuf.size);
+        if ((rval = ql_fw_etrace(ha, &ha->fwfcetracebuf,
+            FTO_FCE_TRACE_ENABLE, &mr)) != QL_SUCCESS) {
+                EL(ha, "fcetrace enable failed: %xh\n", rval);
+        } else {
+                ha->fw_fce_trace_enable = mr;
+                EL(ha, "FCE Trace Re-Enabled\n");
+        }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        kmem_free(fce_trace, FWFCESIZE);
+
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_pci_data
  *      Retrieves pci config space data

@@ -7852,11 +8337,11 @@
 {
         uint8_t         cap_ptr;
         uint8_t         cap_id;
         uint32_t        buf_size = 256;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /*
          * First check the "Capabilities List" bit of the status register.
          */
         if (ql_pci_config_get16(ha, PCI_CONF_STAT) & PCI_STAT_CAP) {

@@ -7895,11 +8380,11 @@
         } else {
                 cmd->Status = EXT_STATUS_OK;
                 cmd->DetailStatus = buf_size;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_pci_dump
  *      Dumps PCI config data to application buffer.

@@ -7917,11 +8402,11 @@
 ql_pci_dump(ql_adapter_state_t *ha, uint32_t *bp, uint32_t pci_size, int mode)
 {
         uint32_t        pci_os;
         uint32_t        *ptr32, *org_ptr32;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         ptr32 = kmem_zalloc(pci_size, KM_SLEEP);
         if (ptr32 == NULL) {
                 EL(ha, "failed kmem_zalloc\n");
                 return (ENOMEM);

@@ -7944,11 +8429,11 @@
 
         QL_DUMP_9(org_ptr32, 8, pci_size);
 
         kmem_free(org_ptr32, pci_size);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 
         return (0);
 }
 
 /*

@@ -7970,11 +8455,11 @@
 {
         EXT_MENLO_RESET rst;
         ql_mbx_data_t   mr;
         int             rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if ((CFG_IST(ha, CFG_CTRL_MENLO)) == 0) {
                 EL(ha, "failed, invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;

@@ -8027,11 +8512,11 @@
                 cmd->ResponseLen = 0;
         }
 
         ql_restart_hba(ha);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_menlo_get_fw_version
  *      Get Menlo firmware version.

@@ -8051,11 +8536,11 @@
 {
         int                             rval;
         ql_mbx_iocb_t                   *pkt;
         EXT_MENLO_GET_FW_VERSION        ver = {0};
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if ((CFG_IST(ha, CFG_CTRL_MENLO)) == 0) {
                 EL(ha, "failed, invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;

@@ -8109,11 +8594,11 @@
                 cmd->ResponseLen = sizeof (EXT_MENLO_GET_FW_VERSION);
         }
 
         kmem_free(pkt, sizeof (ql_mbx_iocb_t));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_menlo_update_fw
  *      Get Menlo update firmware.

@@ -8135,11 +8620,11 @@
         dma_mem_t               *dma_mem;
         EXT_MENLO_UPDATE_FW     fw;
         uint32_t                *ptr32;
         int                     rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         if ((CFG_IST(ha, CFG_CTRL_MENLO)) == 0) {
                 EL(ha, "failed, invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;

@@ -8198,12 +8683,12 @@
         }
 
         /* Get DMA memory for the IOCB */
         if (ql_get_dma_mem(ha, dma_mem, fw.TotalByteCount, LITTLE_ENDIAN_DMA,
             QL_DMA_DATA_ALIGN) != QL_SUCCESS) {
-                cmn_err(CE_WARN, "%s(%d): request queue DMA memory "
-                    "alloc failed", QL_NAME, ha->instance);
+                cmn_err(CE_WARN, "%srequest queue DMA memory "
+                    "alloc failed", QL_NAME);
                 kmem_free(pkt, sizeof (ql_mbx_iocb_t));
                 kmem_free(dma_mem, sizeof (dma_mem_t));
                 ql_restart_hba(ha);
                 cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
                 cmd->ResponseLen = 0;

@@ -8233,15 +8718,15 @@
         ptr32 = dma_mem->bp;
         pkt->mvfy.fw_version = LE_32(ptr32[2]);
         pkt->mvfy.fw_size = LE_32(fw.TotalByteCount);
         pkt->mvfy.fw_sequence_size = LE_32(fw.TotalByteCount);
         pkt->mvfy.dseg_count = LE_16(1);
-        pkt->mvfy.dseg_0_address[0] = (uint32_t)
+        pkt->mvfy.dseg.address[0] = (uint32_t)
             LE_32(LSD(dma_mem->cookie.dmac_laddress));
-        pkt->mvfy.dseg_0_address[1] = (uint32_t)
+        pkt->mvfy.dseg.address[1] = (uint32_t)
             LE_32(MSD(dma_mem->cookie.dmac_laddress));
-        pkt->mvfy.dseg_0_length = LE_32(fw.TotalByteCount);
+        pkt->mvfy.dseg.length = LE_32(fw.TotalByteCount);
 
         rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, sizeof (ql_mbx_iocb_t));
         LITTLE_ENDIAN_16(&pkt->mvfy.options_status);
         LITTLE_ENDIAN_16(&pkt->mvfy.failure_code);
 

@@ -8260,11 +8745,11 @@
         ql_free_dma_resource(ha, dma_mem);
         kmem_free(pkt, sizeof (ql_mbx_iocb_t));
         kmem_free(dma_mem, sizeof (dma_mem_t));
         ql_restart_hba(ha);
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_menlo_manage_info
  *      Get Menlo manage info.

@@ -8285,22 +8770,21 @@
         ql_mbx_iocb_t           *pkt;
         dma_mem_t               *dma_mem = NULL;
         EXT_MENLO_MANAGE_INFO   info;
         int                     rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
 
         /* The call is only supported for Schultz right now */
-        if (CFG_IST(ha, CFG_CTRL_8081)) {
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
                 ql_get_xgmac_statistics(ha, cmd, mode);
-                QL_PRINT_9(CE_CONT, "(%d): CFG_CTRL_81XX done\n",
-                    ha->instance);
+                QL_PRINT_9(ha, "CFG_FCOE_SUPPORT done\n");
                 return;
         }
 
-        if (!CFG_IST(ha, CFG_CTRL_8081) || !CFG_IST(ha, CFG_CTRL_MENLO)) {
+        if (!CFG_IST(ha, CFG_CTRL_MENLO)) {
                 EL(ha, "failed, invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -8354,12 +8838,12 @@
                         cmd->ResponseLen = 0;
                         return;
                 }
                 if (ql_get_dma_mem(ha, dma_mem, info.TotalByteCount,
                     LITTLE_ENDIAN_DMA, QL_DMA_DATA_ALIGN) != QL_SUCCESS) {
-                        cmn_err(CE_WARN, "%s(%d): request queue DMA memory "
-                            "alloc failed", QL_NAME, ha->instance);
+                        cmn_err(CE_WARN, "%srequest queue DMA memory "
+                            "alloc failed", QL_NAME);
                         kmem_free(dma_mem, sizeof (dma_mem_t));
                         kmem_free(pkt, sizeof (ql_mbx_iocb_t));
                         cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
                         cmd->ResponseLen = 0;
                         return;

@@ -8380,15 +8864,15 @@
                         }
                         (void) ddi_dma_sync(dma_mem->dma_handle, 0,
                             dma_mem->size, DDI_DMA_SYNC_FORDEV);
                 }
                 pkt->mdata.dseg_count = LE_16(1);
-                pkt->mdata.dseg_0_address[0] = (uint32_t)
+                pkt->mdata.dseg.address[0] = (uint32_t)
                     LE_32(LSD(dma_mem->cookie.dmac_laddress));
-                pkt->mdata.dseg_0_address[1] = (uint32_t)
+                pkt->mdata.dseg.address[1] = (uint32_t)
                     LE_32(MSD(dma_mem->cookie.dmac_laddress));
-                pkt->mdata.dseg_0_length = LE_32(info.TotalByteCount);
+                pkt->mdata.dseg.length = LE_32(info.TotalByteCount);
         } else if (info.Operation & MENLO_OP_CHANGE_CONFIG) {
                 pkt->mdata.parameter_1 =
                     LE_32(info.Parameters.ap.MenloConfig.ConfigParamID);
                 pkt->mdata.parameter_2 =
                     LE_32(info.Parameters.ap.MenloConfig.ConfigParamData0);

@@ -8428,11 +8912,11 @@
 
         ql_free_dma_resource(ha, dma_mem);
         kmem_free(dma_mem, sizeof (dma_mem_t));
         kmem_free(pkt, sizeof (ql_mbx_iocb_t));
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_suspend_hba
  *      Suspends all adapter ports.

@@ -8523,11 +9007,11 @@
         PEXT_VPORT_ID_CNT       ptmp_vp;
         int                     id = 0;
         int                     rval;
         char                    name[MAXPATHLEN];
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /*
          * To be backward compatible with older API
          * check for the size of old EXT_VPORT_ID_CNT
          */

@@ -8551,11 +9035,12 @@
         vha = ha->vp_next;
         while (vha != NULL) {
                 ptmp_vp->VpCnt++;
                 ptmp_vp->VpId[id] = vha->vp_index;
                 (void) ddi_pathname(vha->dip, name);
-                (void) strcpy((char *)ptmp_vp->vp_path[id], name);
+                (void) strncpy((char *)ptmp_vp->vp_path[id], name,
+                    (sizeof (ptmp_vp->vp_path[id]) -1));
                 ptmp_vp->VpDrvInst[id] = (int32_t)vha->instance;
                 id++;
                 vha = vha->vp_next;
         }
         rval = ddi_copyout((void *)ptmp_vp,

@@ -8565,14 +9050,14 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_VPORT_ID_CNT);
-                QL_PRINT_9(CE_CONT, "(%d): done, vport_cnt=%d\n",
+                QL_PRINT_9(ha, "done, vport_cnt=%d\n",
                     ha->instance, ptmp_vp->VpCnt);
         }
-
+        kmem_free(ptmp_vp, sizeof (EXT_VPORT_ID_CNT));
 }
 
 /*
  * ql_vp_ioctl
  *      Performs all EXT_CC_VPORT_CMD functions.

@@ -8589,11 +9074,11 @@
  *      Kernel context.
  */
 static void
 ql_vp_ioctl(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started, cmd=%d\n", ha->instance,
+        QL_PRINT_9(ha, "started, cmd=%d\n",
             cmd->SubCode);
 
         /* case off on command subcode */
         switch (cmd->SubCode) {
         case EXT_VF_SC_VPORT_GETINFO:

@@ -8605,11 +9090,11 @@
                 EL(ha, "failed, Unsupported Subcode=%xh\n",
                     cmd->SubCode);
                 break;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_qry_vport
  *      Performs EXT_VF_SC_VPORT_GETINFO subfunction.

@@ -8628,13 +9113,12 @@
 static void
 ql_qry_vport(ql_adapter_state_t *vha, EXT_IOCTL *cmd, int mode)
 {
         ql_adapter_state_t      *tmp_vha;
         EXT_VPORT_INFO          tmp_vport = {0};
-        int                     max_vport;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", vha->instance);
+        QL_PRINT_9(vha, "started\n", vha->instance);
 
         if (cmd->ResponseLen < sizeof (EXT_VPORT_INFO)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_VPORT_INFO);
                 EL(vha, "failed, ResponseLen < EXT_VPORT_INFO, Len=%xh\n",

@@ -8655,14 +9139,12 @@
         while (tmp_vha != NULL) {
                 tmp_vport.used++;
                 tmp_vha = tmp_vha->vp_next;
         }
 
-        max_vport = (CFG_IST(vha, CFG_CTRL_2422) ? MAX_24_VIRTUAL_PORTS :
-            MAX_25_VIRTUAL_PORTS);
-        if (max_vport > tmp_vport.used) {
-                tmp_vport.free = max_vport - tmp_vport.used;
+        if (vha->max_vports > tmp_vport.used) {
+                tmp_vport.free = vha->max_vports - tmp_vport.used;
         }
 
         if (ddi_copyout((void *)&tmp_vport,
             (void *)(uintptr_t)(cmd->ResponseAdr),
             sizeof (EXT_VPORT_INFO), mode) != 0) {

@@ -8669,11 +9151,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(vha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_VPORT_INFO);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", vha->instance);
+                QL_PRINT_9(vha, "done\n", vha->instance);
         }
 }
 
 /*
  * ql_access_flash

@@ -8693,12 +9175,21 @@
 static void
 ql_access_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         int     rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1) &&
+            ql_stall_driver(ha, 0) != QL_SUCCESS) {
+                EL(ha, "ql_stall_driver failed\n");
+                ql_restart_driver(ha);
+                cmd->Status = EXT_STATUS_BUSY;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
         switch (cmd->SubCode) {
         case EXT_SC_FLASH_READ:
                 if ((rval = ql_flash_fcode_dump(ha,
                     (void *)(uintptr_t)(cmd->ResponseAdr),
                     (size_t)(cmd->ResponseLen), cmd->Reserved1, mode)) != 0) {

@@ -8725,11 +9216,18 @@
                 cmd->Status = EXT_STATUS_ERR;
                 cmd->ResponseLen = 0;
                 break;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        /* Resume I/O */
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
+                EL(ha, "isp_abort_needed for restart\n");
+                ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED,
+                    DRIVER_STALL);
+        }
+
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_reset_cmd
  *      Performs all EXT_CC_RESET_FW_OS functions.

@@ -8745,33 +9243,52 @@
  *      Kernel context.
  */
 static void
 ql_reset_cmd(ql_adapter_state_t *ha, EXT_IOCTL *cmd)
 {
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        uint8_t timer;
 
+        QL_PRINT_9(ha, "started\n");
+
         switch (cmd->SubCode) {
         case EXT_SC_RESET_FC_FW:
+                if (CFG_IST(ha, CFG_CTRL_82XX)) {
+                        (void) ql_8021_reset_fw(ha);
+                } else {
                 EL(ha, "isp_abort_needed\n");
                 ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED, 0);
+                }
+                for (timer = 180; timer; timer--) {
+                        ql_awaken_task_daemon(ha, NULL, 0, 0);
+                        /* Delay for 1 second. */
+                        delay(100);
+                        if (!(ha->task_daemon_flags & (ISP_ABORT_NEEDED |
+                            ABORT_ISP_ACTIVE | LOOP_RESYNC_NEEDED |
+                            LOOP_RESYNC_ACTIVE))) {
                 break;
+                        }
+                }
+                break;
         case EXT_SC_RESET_MPI_FW:
-                if (!(CFG_IST(ha, CFG_CTRL_81XX))) {
+                if (!(CFG_IST(ha, CFG_CTRL_8081))) {
                         EL(ha, "invalid request for HBA\n");
                         cmd->Status = EXT_STATUS_INVALID_REQUEST;
                         cmd->ResponseLen = 0;
                 } else {
+                        ADAPTER_STATE_LOCK(ha);
+                        ha->flags |= DISABLE_NIC_FW_DMP;
+                        ADAPTER_STATE_UNLOCK(ha);
+
                         /* Wait for I/O to stop and daemon to stall. */
                         if (ql_suspend_hba(ha, 0) != QL_SUCCESS) {
                                 EL(ha, "ql_suspend_hba failed\n");
                                 cmd->Status = EXT_STATUS_BUSY;
                                 cmd->ResponseLen = 0;
                         } else if (ql_restart_mpi(ha) != QL_SUCCESS) {
                                 cmd->Status = EXT_STATUS_ERR;
                                 cmd->ResponseLen = 0;
                         } else {
-                                uint8_t timer;
                                 /*
                                  * While the restart_mpi mailbox cmd may be
                                  * done the MPI is not. Wait at least 6 sec. or
                                  * exit if the loop comes up.
                                  */

@@ -8783,20 +9300,24 @@
                                         /* Delay for 1 second. */
                                         ql_delay(ha, 1000000);
                                 }
                         }
                         ql_restart_hba(ha);
+
+                        ADAPTER_STATE_LOCK(ha);
+                        ha->flags &= ~DISABLE_NIC_FW_DMP;
+                        ADAPTER_STATE_UNLOCK(ha);
                 }
                 break;
         default:
                 EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
                 cmd->Status = EXT_STATUS_ERR;
                 cmd->ResponseLen = 0;
                 break;
         }
 
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_dcbx_parameters
  *      Get DCBX parameters.

@@ -8810,13 +9331,13 @@
 ql_get_dcbx_parameters(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         uint8_t         *tmp_buf;
         int             rval;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (!(CFG_IST(ha, CFG_CTRL_8081))) {
+        if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) {
                 EL(ha, "invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -8848,11 +9369,11 @@
                 EL(ha, "failed, ddi_copyout\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
         } else {
                 cmd->ResponseLen = EXT_DEF_DCBX_PARAM_BUF_SIZE;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
         kmem_free(tmp_buf, EXT_DEF_DCBX_PARAM_BUF_SIZE);
 
 }
 

@@ -8874,13 +9395,13 @@
 static void
 ql_qry_cna_port(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
 {
         EXT_CNA_PORT    cna_port = {0};
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (!(CFG_IST(ha, CFG_CTRL_8081))) {
+        if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) {
                 EL(ha, "invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -8905,11 +9426,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_CNA_PORT);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 }
 
 /*
  * ql_qry_adapter_versions

@@ -8932,11 +9453,11 @@
 {
         uint8_t                         is_8142, mpi_cap;
         uint32_t                        ver_len, transfer_size;
         PEXT_ADAPTERREGIONVERSION       padapter_ver = NULL;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /* 8142s do not have a EDC PHY firmware. */
         mpi_cap = (uint8_t)(ha->mpi_capability_list >> 8);
 
         is_8142 = 0;

@@ -9006,11 +9527,11 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = ver_len;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 
         kmem_free(padapter_ver, ver_len);
 }
 

@@ -9035,11 +9556,11 @@
         int                     rval;
         uint32_t                size;
         int8_t                  *tmp_buf;
         EXT_MENLO_MANAGE_INFO   info;
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
         /*  Verify the size of request structure. */
         if (cmd->RequestLen < sizeof (EXT_MENLO_MANAGE_INFO)) {
                 /* Return error */
                 EL(ha, "RequestLen=%d < %d\n", cmd->RequestLen,

@@ -9102,14 +9623,14 @@
                 EL(ha, "failed, ddi_copyout\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
         } else {
                 cmd->ResponseLen = info.TotalByteCount;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
         kmem_free(tmp_buf, size);
-        QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_9(ha, "done\n");
 }
 
 /*
  * ql_get_fcf_list
  *      Get FCF list.

@@ -9125,13 +9646,13 @@
         uint8_t                 *tmp_buf;
         int                     rval;
         EXT_FCF_LIST            fcf_list = {0};
         ql_fcf_list_desc_t      mb_fcf_list = {0};
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (!(CFG_IST(ha, CFG_CTRL_81XX))) {
+        if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) {
                 EL(ha, "invalid request for HBA\n");
                 cmd->Status = EXT_STATUS_INVALID_REQUEST;
                 cmd->ResponseLen = 0;
                 return;
         }

@@ -9187,11 +9708,11 @@
                 EL(ha, "failed, ddi_copyout\n");
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
         } else {
                 cmd->ResponseLen = mb_fcf_list.buffer_size;
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
 
         kmem_free(tmp_buf, fcf_list.BufSize);
 }
 

@@ -9209,19 +9730,12 @@
 {
         int                     rval;
         ql_mbx_data_t           mr;
         EXT_RESOURCE_CNTS       tmp_rc_cnt = {0};
 
-        QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_9(ha, "started\n");
 
-        if (!(CFG_IST(ha, CFG_CTRL_242581))) {
-                EL(ha, "invalid request for HBA\n");
-                cmd->Status = EXT_STATUS_INVALID_REQUEST;
-                cmd->ResponseLen = 0;
-                return;
-        }
-
         if (cmd->ResponseLen < sizeof (EXT_RESOURCE_CNTS)) {
                 cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
                 cmd->DetailStatus = sizeof (EXT_RESOURCE_CNTS);
                 EL(ha, "failed, ResponseLen < EXT_RESOURCE_CNTS, "
                     "Len=%xh\n", cmd->ResponseLen);

@@ -9241,12 +9755,16 @@
         tmp_rc_cnt.CurTgtXchgCtrlCnt = (uint32_t)mr.mb[2];
         tmp_rc_cnt.CurXchgCtrlCnt = (uint32_t)mr.mb[3];
         tmp_rc_cnt.OrgXchgCtrlCnt = (uint32_t)mr.mb[6];
         tmp_rc_cnt.CurIocbBufCnt = (uint32_t)mr.mb[7];
         tmp_rc_cnt.OrgIocbBufCnt = (uint32_t)mr.mb[10];
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
         tmp_rc_cnt.NoOfSupVPs = (uint32_t)mr.mb[11];
+        }
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
         tmp_rc_cnt.NoOfSupFCFs = (uint32_t)mr.mb[12];
+        }
 
         rval = ddi_copyout((void *)&tmp_rc_cnt,
             (void *)(uintptr_t)(cmd->ResponseAdr),
             sizeof (EXT_RESOURCE_CNTS), mode);
         if (rval != 0) {

@@ -9253,8 +9771,954 @@
                 cmd->Status = EXT_STATUS_COPY_ERR;
                 cmd->ResponseLen = 0;
                 EL(ha, "failed, ddi_copyout\n");
         } else {
                 cmd->ResponseLen = sizeof (EXT_RESOURCE_CNTS);
-                QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_9(ha, "done\n");
         }
+}
+
+/*
+ * ql_get_temperature
+ *      Get ASIC temperature data
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    EXT_IOCTL cmd struct pointer.
+ *      mode:   flags
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_get_temperature(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        ql_mbx_data_t   mr;
+        int             rval = 0;
+        EXT_BOARD_TEMP  board_temp = {0};
+
+        QL_PRINT_9(ha, "started\n");
+
+        if (!(ha->fw_ext_attributes & TEMP_SUPPORT_ISP)) {
+                EL(ha, "invalid request for HBA\n");
+                cmd->Status = EXT_STATUS_INVALID_REQUEST;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        if (cmd->ResponseLen < sizeof (EXT_BOARD_TEMP)) {
+                cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+                cmd->DetailStatus = sizeof (EXT_BOARD_TEMP);
+                EL(ha, "failed, ResponseLen < EXT_BOARD_TEMP, "
+                    "Len=%xh \n", cmd->ResponseLen);
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        switch (cmd->SubCode) {
+        case EXT_SC_GET_BOARD_TEMP:
+                rval = ql_get_temp(ha, &mr);
+                if (rval != QL_SUCCESS) {
+                        /* error */
+                        EL(ha, "failed, get_temperature_mbx=%xh\n", rval);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        break;
+                }
+                board_temp.IntTemp = mr.mb[1];
+
+                rval = ddi_copyout((void *)&board_temp,
+                    (void *)(uintptr_t)(cmd->ResponseAdr),
+                    sizeof (EXT_BOARD_TEMP), mode);
+                if (rval != 0) {
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                        EL(ha, "failed, ddi_copyout\n");
+                } else {
+                        cmd->ResponseLen = sizeof (EXT_BOARD_TEMP);
+                }
+                break;
+        default:
+                EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+                cmd->Status = EXT_STATUS_ERR;
+                cmd->ResponseLen = 0;
+                break;
+        }
+
+        QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_dump_cmd
+ *      Performs all EXT_CC_DUMP_OS functions.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    Local EXT_IOCTL cmd struct pointer.
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_dump_cmd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        caddr_t         dump;
+        uint32_t        sdm_valid_dump = 0;
+        int             rval = 0;
+
+        QL_PRINT_9(ha, "started\n");
+
+        if (ha->ql_dump_state & QL_DUMP_VALID &&
+            !(ha->ql_dump_state & QL_DUMP_UPLOADED) &&
+            ha->ql_dump_state != NULL) {
+                sdm_valid_dump = 1;
+        } else {
+                EL(ha, "dump does not exist for instance %d (%x, %p)\n",
+                    ha->instance, ha->ql_dump_state, ha->ql_dump_ptr);
+        }
+
+        cmd->Status = EXT_STATUS_OK;
+        cmd->DetailStatus = 0;
+
+        switch (cmd->SubCode) {
+        case EXT_SC_DUMP_SIZE:
+                cmd->ResponseLen = 0;
+                if (sdm_valid_dump) {
+                        cmd->DetailStatus = ha->risc_dump_size;
+                }
+                break;
+        case EXT_SC_DUMP_READ:
+                if (!sdm_valid_dump) {
+                        cmd->Status = EXT_STATUS_INVALID_REQUEST;
+                        cmd->ResponseLen = 0;
+                        break;
+                }
+
+                if (cmd->ResponseLen < ha->risc_dump_size) {
+                        cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+                        cmd->DetailStatus = ha->risc_dump_size;
+                        EL(ha, "failed, ResponseLen < %x, "
+                            "Len=%xh\n", ha->risc_dump_size,
+                            cmd->ResponseLen);
+                        break;
+                }
+
+                ADAPTER_STATE_LOCK(ha);
+                ha->flags |= DISABLE_NIC_FW_DMP;
+                ADAPTER_STATE_UNLOCK(ha);
+
+                QL_DUMP_LOCK(ha);
+
+                dump = kmem_zalloc(ha->risc_dump_size, KM_SLEEP);
+                cmd->ResponseLen = (uint32_t)ql_ascii_fw_dump(ha, dump);
+
+                if ((rval = ddi_copyout((void *)dump,
+                    (void *)(uintptr_t)(cmd->ResponseAdr), cmd->ResponseLen,
+                    mode)) != 0) {
+                        ha->ql_dump_state &= ~QL_DUMP_UPLOADED;
+                        EL(ha, "failed, ddi_copyout\n");
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                } else {
+                        ha->ql_dump_state |= QL_DUMP_UPLOADED;
+                }
+
+                kmem_free(dump, ha->risc_dump_size);
+
+                QL_DUMP_UNLOCK(ha);
+
+                ADAPTER_STATE_LOCK(ha);
+                ha->flags &= ~DISABLE_NIC_FW_DMP;
+                ADAPTER_STATE_UNLOCK(ha);
+                break;
+        case EXT_SC_DUMP_TRIGGER:
+                cmd->ResponseLen = 0;
+
+                ADAPTER_STATE_LOCK(ha);
+                ha->flags |= DISABLE_NIC_FW_DMP;
+                ADAPTER_STATE_UNLOCK(ha);
+
+                if (sdm_valid_dump) {
+                        cmd->Status = EXT_STATUS_INVALID_REQUEST;
+                        EL(ha, "Existing dump file needs to be retrieved.\n");
+                } else {
+                        rval = ql_dump_firmware(ha);
+
+                        if (rval != QL_SUCCESS && rval != QL_DATA_EXISTS) {
+                                cmd->Status = EXT_STATUS_ERR;
+                        }
+                }
+
+                ADAPTER_STATE_LOCK(ha);
+                ha->flags &= ~DISABLE_NIC_FW_DMP;
+                ADAPTER_STATE_UNLOCK(ha);
+                break;
+        default:
+                EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+                cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+                cmd->ResponseLen = 0;
+                break;
+        }
+
+        QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_serdes_reg
+ *      Performs all EXT_CC_SERDES_REG_OP functions.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    EXT_IOCTL cmd struct pointer.
+ *      mode:   flags
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_serdes_reg(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        ql_mbx_data_t   mr = {0};
+        int             rval = 0;
+        EXT_SERDES_REG  serdes_reg = {0};
+
+        QL_PRINT_9(ha, "started\n");
+
+        /* Check if request valid for HBA */
+        if (!(CFG_IST(ha, CFG_SERDES_SUPPORT))) {
+                EL(ha, "invalid request for HBA\n");
+                cmd->Status = EXT_STATUS_INVALID_REQUEST;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        /* Copy in the request structure. */
+        if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
+            (void *)&serdes_reg, sizeof (EXT_SERDES_REG), mode) != 0) {
+                EL(ha, "failed, ddi_copyin\n");
+                cmd->Status = EXT_STATUS_COPY_ERR;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        switch (cmd->SubCode) {
+        case EXT_SC_WRITE_SERDES_REG:
+                mr.mb[1] = serdes_reg.addr;
+                mr.mb[2] = LSB(serdes_reg.val);
+                mr.mb[3] = 0;
+                mr.mb[4] = MSB(serdes_reg.val);
+                if ((rval = ql_write_serdes(ha, &mr)) != QL_SUCCESS) {
+                        /* error */
+                        EL(ha, "failed, write_serdes_mbx=%xh\n", rval);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        break;
+                } else {
+                        cmd->Status = EXT_STATUS_OK;
+                }
+                break;
+        case EXT_SC_READ_SERDES_REG:
+                /* Verify the size of response structure. */
+                if (cmd->ResponseLen < sizeof (EXT_SERDES_REG)) {
+                        cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+                        cmd->DetailStatus = sizeof (EXT_SERDES_REG);
+                        EL(ha, "failed, ResponseLen < EXT_SERDES_REG, "
+                            "Len=%xh \n", cmd->ResponseLen);
+                        cmd->ResponseLen = 0;
+                        break;
+                }
+                mr.mb[1] = serdes_reg.addr;
+                if ((rval = ql_read_serdes(ha, &mr)) != QL_SUCCESS) {
+                        /* error */
+                        EL(ha, "failed, read_serdes_mbx=%xh\n", rval);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        break;
+                }
+                serdes_reg.val = CHAR_TO_SHORT(LSB(mr.mb[1]), LSB(mr.mb[2]));
+                /* Copy back the response data */
+                if (ddi_copyout((void *)&serdes_reg,
+                    (void *)(uintptr_t)(cmd->ResponseAdr),
+                    sizeof (EXT_SERDES_REG), mode) != 0) {
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                        EL(ha, "failed, ddi_copyout\n");
+                } else {
+                        cmd->Status = EXT_STATUS_OK;
+                        cmd->ResponseLen = sizeof (EXT_SERDES_REG);
+                }
+                break;
+        default:
+                /* Subcode not supported. */
+                EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+                cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+                cmd->ResponseLen = 0;
+                break;
+        }
+
+        QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_serdes_reg_ex
+ *      Performs all EXT_CC_SERDES_REG_OP_EX functions.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    EXT_IOCTL cmd struct pointer.
+ *      mode:   flags
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_serdes_reg_ex(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        ql_mbx_data_t           mr = {0};
+        int                     rval = 0;
+        EXT_SERDES_REG_EX       serdes_reg_ex = {0};
+
+        QL_PRINT_9(ha, "started\n");
+
+        /* Check if request valid for HBA */
+        if (!(CFG_IST(ha, CFG_SERDES_SUPPORT))) {
+                EL(ha, "invalid request for HBA\n");
+                cmd->Status = EXT_STATUS_INVALID_REQUEST;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        /* Copy in the request structure. */
+        if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
+            (void *)&serdes_reg_ex, sizeof (EXT_SERDES_REG_EX), mode) != 0) {
+                EL(ha, "failed, ddi_copyin\n");
+                cmd->Status = EXT_STATUS_COPY_ERR;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        switch (cmd->SubCode) {
+        case EXT_SC_WRITE_SERDES_REG:
+                mr.mb[3] = LSW(serdes_reg_ex.addr);
+                mr.mb[4] = MSW(serdes_reg_ex.addr);
+                mr.mb[5] = LSW(serdes_reg_ex.val);
+                mr.mb[6] = MSW(serdes_reg_ex.val);
+                if ((rval = ql_write_serdes(ha, &mr)) != QL_SUCCESS) {
+                        /* error */
+                        EL(ha, "failed, write_serdes_mbx=%xh\n", rval);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        break;
+                } else {
+                        cmd->Status = EXT_STATUS_OK;
+                }
+                break;
+        case EXT_SC_READ_SERDES_REG:
+                /* Verify the size of response structure. */
+                if (cmd->ResponseLen < sizeof (EXT_SERDES_REG_EX)) {
+                        cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+                        cmd->DetailStatus = sizeof (EXT_SERDES_REG_EX);
+                        EL(ha, "failed, ResponseLen < EXT_SERDES_REG_EX, "
+                            "Len=%xh\n", cmd->ResponseLen);
+                        cmd->ResponseLen = 0;
+                        break;
+                }
+                mr.mb[3] = LSW(serdes_reg_ex.addr);
+                mr.mb[4] = MSW(serdes_reg_ex.addr);
+                if ((rval = ql_read_serdes(ha, &mr)) != QL_SUCCESS) {
+                        /* error */
+                        EL(ha, "failed, read_serdes_mbx=%xh\n", rval);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        break;
+                }
+                serdes_reg_ex.val = SHORT_TO_LONG(mr.mb[1], mr.mb[2]);
+                /* Copy back the response data */
+                if (ddi_copyout((void *)&serdes_reg_ex,
+                    (void *)(uintptr_t)(cmd->ResponseAdr),
+                    sizeof (EXT_SERDES_REG_EX), mode) != 0) {
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                        EL(ha, "failed, ddi_copyout\n");
+                } else {
+                        cmd->Status = EXT_STATUS_OK;
+                        cmd->ResponseLen = sizeof (EXT_SERDES_REG_EX);
+                }
+                break;
+        default:
+                /* Subcode not supported. */
+                EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+                cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+                cmd->ResponseLen = 0;
+                break;
+        }
+
+        QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_els_passthru
+ *      IOCTL for extended link service passthru command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    User space CT arguments pointer.
+ *      mode:   flags.
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_els_passthru(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        ql_mbx_iocb_t           *pkt;
+        dma_mem_t               *dma_mem;
+        caddr_t                 bp, pld;
+        uint32_t                pkt_size, pld_byte_cnt, cmd_size, *long_ptr;
+        EXT_ELS_PT_REQ          *pt_req;
+        boolean_t               local_hba = B_FALSE;
+        ql_tgt_t                *tq = NULL;
+        port_id_t               tmp_fcid;
+        int                     rval;
+        uint16_t                comp_status;
+
+        QL_PRINT_9(ha, "started\n");
+
+        if (DRIVER_SUSPENDED(ha)) {
+                EL(ha, "failed, LOOP_NOT_READY\n");
+                cmd->Status = EXT_STATUS_BUSY;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        if (cmd->RequestLen < sizeof (EXT_ELS_PT_REQ)) {
+                /* parameter error */
+                EL(ha, "failed, RequestLen < EXT_ELS_PT_REQ, Len=%xh\n",
+                    cmd->RequestLen);
+                cmd->Status = EXT_STATUS_INVALID_PARAM;
+                cmd->DetailStatus = EXT_DSTATUS_REQUEST_LEN;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        /* Allocate memory for command. */
+        bp = kmem_zalloc(cmd->RequestLen, KM_SLEEP);
+
+        if (ddi_copyin((void*)(uintptr_t)cmd->RequestAdr,
+            bp, cmd->RequestLen, mode) != 0) {
+                EL(ha, "failed, ddi_copyin\n");
+                kmem_free(bp, cmd->RequestLen);
+                cmd->Status = EXT_STATUS_COPY_ERR;
+                cmd->ResponseLen = 0;
+                return;
+        }
+        pt_req = (EXT_ELS_PT_REQ *)bp;
+
+        QL_PRINT_9(ha, "EXT_ELS_PT_REQ\n");
+        QL_DUMP_9((uint8_t *)pt_req, 8, sizeof (EXT_ELS_PT_REQ));
+
+        /* Find loop ID of the device */
+        if (pt_req->ValidMask & EXT_DEF_WWPN_VALID) {
+                if (bcmp(ha->loginparams.nport_ww_name.raw_wwn, pt_req->WWPN,
+                    EXT_DEF_WWN_NAME_SIZE) == 0) {
+                        local_hba = B_TRUE;
+                } else {
+                        tq = ql_find_port(ha, pt_req->WWPN, QLNT_PORT);
+                }
+        } else if (pt_req->ValidMask & EXT_DEF_PID_VALID) {
+                /*
+                 * Copy caller's d_id to tmp space.
+                 */
+                bcopy(&pt_req->Id[1], tmp_fcid.r.d_id,
+                    EXT_DEF_PORTID_SIZE_ACTUAL);
+                BIG_ENDIAN_24(&tmp_fcid.r.d_id[0]);
+
+                if (bcmp((void *)&ha->d_id, (void *)tmp_fcid.r.d_id,
+                    EXT_DEF_PORTID_SIZE_ACTUAL) == 0) {
+                        local_hba = B_TRUE;
+                } else {
+                        tq = ql_find_port(ha, (uint8_t *)tmp_fcid.r.d_id,
+                            QLNT_PID);
+                }
+        } else if (pt_req->ValidMask & EXT_DEF_WWNN_VALID) {
+                if (bcmp(ha->loginparams.node_ww_name.raw_wwn, pt_req->WWNN,
+                    EXT_DEF_WWN_NAME_SIZE) == 0) {
+                        local_hba = B_TRUE;
+                } else {
+                        tq = ql_find_port(ha, pt_req->WWNN, QLNT_NODE);
+                }
+        }
+
+        if (local_hba == B_TRUE) {
+                EL(ha, "failed, els to adapter\n");
+                kmem_free(bp, cmd->RequestLen);
+                cmd->Status = EXT_STATUS_ERR;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        if (tq == NULL) {
+                /* no matching device */
+                EL(ha, "failed, device not found\n");
+                kmem_free(bp, cmd->RequestLen);
+                cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
+                cmd->DetailStatus = EXT_DSTATUS_TARGET;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        /* Allocate a DMA Memory Descriptor */
+        dma_mem = (dma_mem_t *)kmem_zalloc(sizeof (dma_mem_t), KM_SLEEP);
+        if (dma_mem == NULL) {
+                EL(ha, "failed, kmem_zalloc\n");
+                kmem_free(bp, cmd->RequestLen);
+                cmd->Status = EXT_STATUS_NO_MEMORY;
+                cmd->ResponseLen = 0;
+                return;
+        }
+        /* Determine maximum buffer size. */
+        cmd_size = cmd->RequestLen - sizeof (EXT_ELS_PT_REQ);
+        pld_byte_cnt = cmd_size < cmd->ResponseLen ? cmd->ResponseLen :
+            cmd_size;
+        pld = (caddr_t)(bp + sizeof (EXT_ELS_PT_REQ));
+
+        /* Allocate command block. */
+        pkt_size = (uint32_t)(sizeof (ql_mbx_iocb_t));
+        pkt = kmem_zalloc(pkt_size, KM_SLEEP);
+        if (pkt == NULL) {
+                EL(ha, "failed, kmem_zalloc\n");
+                kmem_free(dma_mem, sizeof (dma_mem_t));
+                kmem_free(bp, cmd->RequestLen);
+                cmd->Status = EXT_STATUS_NO_MEMORY;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        /* Get DMA memory for the payload */
+        if (ql_get_dma_mem(ha, dma_mem, pld_byte_cnt, LITTLE_ENDIAN_DMA,
+            QL_DMA_RING_ALIGN) != QL_SUCCESS) {
+                cmn_err(CE_WARN, "%sDMA memory alloc failed", QL_NAME);
+                kmem_free(pkt, pkt_size);
+                kmem_free(dma_mem, sizeof (dma_mem_t));
+                kmem_free(bp, cmd->RequestLen);
+                cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        /* Copy out going payload data to IOCB DMA buffer. */
+        ddi_rep_put8(dma_mem->acc_handle, (uint8_t *)pld,
+            (uint8_t *)dma_mem->bp, cmd_size, DDI_DEV_AUTOINCR);
+
+        /* Sync IOCB DMA buffer. */
+        (void) ddi_dma_sync(dma_mem->dma_handle, 0, cmd_size,
+            DDI_DMA_SYNC_FORDEV);
+
+        /*
+         * Setup IOCB
+         */
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                pkt->els.entry_type = ELS_PASSTHRU_TYPE;
+                pkt->els.entry_count = 1;
+
+                /* Set loop ID */
+                pkt->els.n_port_hdl = tq->loop_id;
+
+                /* Set cmd/response data segment counts. */
+                pkt->els.xmt_dseg_count = LE_16(1);
+                pkt->els.vp_index = ha->vp_index;
+                pkt->els.rcv_dseg_count = LE_16(1);
+
+                pkt->els.els_cmd_opcode = pld[0];
+
+                pkt->els.d_id_7_0 = tq->d_id.b.al_pa;
+                pkt->els.d_id_15_8 = tq->d_id.b.area;
+                pkt->els.d_id_23_16 = tq->d_id.b.domain;
+
+                pkt->els.s_id_7_0 = ha->d_id.b.al_pa;
+                pkt->els.s_id_15_8 = ha->d_id.b.area;
+                pkt->els.s_id_23_16 = ha->d_id.b.domain;
+
+                /* Load rsp byte count. */
+                pkt->els.rcv_payld_data_bcnt = LE_32(cmd->ResponseLen);
+
+                /* Load cmd byte count. */
+                pkt->els.xmt_payld_data_bcnt = LE_32(cmd_size);
+
+                long_ptr = (uint32_t *)&pkt->els.dseg;
+
+                /* Load MS command entry data segments. */
+                *long_ptr++ = (uint32_t)
+                    LE_32(LSD(dma_mem->cookie.dmac_laddress));
+                *long_ptr++ = (uint32_t)
+                    LE_32(MSD(dma_mem->cookie.dmac_laddress));
+                *long_ptr++ = LE_32(cmd_size);
+
+                /* Load MS response entry data segments. */
+                *long_ptr++ = (uint32_t)
+                    LE_32(LSD(dma_mem->cookie.dmac_laddress));
+                *long_ptr++ = (uint32_t)
+                    LE_32(MSD(dma_mem->cookie.dmac_laddress));
+                *long_ptr = LE_32(cmd->ResponseLen);
+
+                rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
+                    sizeof (ql_mbx_iocb_t));
+
+                comp_status = (uint16_t)LE_16(pkt->sts24.comp_status);
+                if (rval == QL_SUCCESS && comp_status == CS_DATA_UNDERRUN) {
+                        comp_status = CS_COMPLETE;
+                }
+                if (rval != QL_SUCCESS ||
+                    (pkt->sts24.entry_status & 0x3c) != 0 ||
+                    comp_status != CS_COMPLETE) {
+                        EL(ha, "failed, I/O timeout, cs=%xh, es=%xh, "
+                            "rval=%xh\n",
+                            comp_status, pkt->sts24.entry_status, rval);
+                        ql_free_dma_resource(ha, dma_mem);
+                        kmem_free(pkt, pkt_size);
+                        kmem_free(dma_mem, sizeof (dma_mem_t));
+                        kmem_free(bp, cmd->RequestLen);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        return;
+                }
+        } else {
+                pkt->ms.entry_type = MS_TYPE;
+                pkt->ms.entry_count = 1;
+
+                /* Set loop ID */
+                if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
+                        pkt->ms.loop_id_l = LSB(tq->loop_id);
+                        pkt->ms.loop_id_h = MSB(tq->loop_id);
+                } else {
+                        pkt->ms.loop_id_h = LSB(tq->loop_id);
+                }
+
+                pkt->ms.control_flags_h = CF_ELS_PASSTHROUGH;
+
+                /* Set ISP command timeout. */
+                pkt->ms.timeout = LE_16(120);
+
+                /* Set data segment counts. */
+                pkt->ms.cmd_dseg_count_l = 1;
+                pkt->ms.total_dseg_count = LE_16(2);
+
+                /* Response total byte count. */
+                pkt->ms.resp_byte_count = LE_32(cmd->ResponseLen);
+                pkt->ms.dseg[1].length = LE_32(cmd->ResponseLen);
+
+                /* Command total byte count. */
+                pkt->ms.cmd_byte_count = LE_32(cmd_size);
+                pkt->ms.dseg[0].length = LE_32(cmd_size);
+
+                /* Load command/response data segments. */
+                pkt->ms.dseg[0].address[0] = (uint32_t)
+                    LE_32(LSD(dma_mem->cookie.dmac_laddress));
+                pkt->ms.dseg[0].address[1] = (uint32_t)
+                    LE_32(MSD(dma_mem->cookie.dmac_laddress));
+                pkt->ms.dseg[1].address[0] = (uint32_t)
+                    LE_32(LSD(dma_mem->cookie.dmac_laddress));
+                pkt->ms.dseg[1].address[1] = (uint32_t)
+                    LE_32(MSD(dma_mem->cookie.dmac_laddress));
+
+                rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
+                    sizeof (ql_mbx_iocb_t));
+
+                comp_status = (uint16_t)LE_16(pkt->sts.comp_status);
+                if (rval == QL_SUCCESS && comp_status == CS_DATA_UNDERRUN) {
+                        comp_status = CS_COMPLETE;
+                }
+                if (rval != QL_SUCCESS ||
+                    (pkt->sts.entry_status & 0x7e) != 0 ||
+                    comp_status != CS_COMPLETE) {
+                        EL(ha, "failed, I/O timeout, cs=%xh, es=%xh, "
+                            "rval=%xh\n",
+                            comp_status, pkt->sts.entry_status, rval);
+                        ql_free_dma_resource(ha, dma_mem);
+                        kmem_free(pkt, pkt_size);
+                        kmem_free(dma_mem, sizeof (dma_mem_t));
+                        kmem_free(bp, cmd->RequestLen);
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                        return;
+                }
+        }
+
+        /* Sync payload DMA buffer. */
+        (void) ddi_dma_sync(dma_mem->dma_handle, 0, cmd->ResponseLen,
+            DDI_DMA_SYNC_FORKERNEL);
+
+        if (ql_send_buffer_data(dma_mem->bp,
+            (caddr_t)(uintptr_t)cmd->ResponseAdr,
+            cmd->ResponseLen, mode) != cmd->ResponseLen) {
+                cmd->Status = EXT_STATUS_COPY_ERR;
+                EL(ha, "failed, ddi_copyout\n");
+        } else {
+                QL_PRINT_9(ha, "els_rsp\n");
+                QL_DUMP_9(pld, 8, cmd->ResponseLen);
+                cmd->Status = EXT_STATUS_OK;
+                QL_PRINT_9(ha, "done\n");
+        }
+
+        ql_free_dma_resource(ha, dma_mem);
+        kmem_free(pkt, pkt_size);
+        kmem_free(dma_mem, sizeof (dma_mem_t));
+        kmem_free(bp, cmd->RequestLen);
+}
+
+/*
+ * ql_flash_update_caps
+ *      IOCTL for flash update capabilities command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    User space CT arguments pointer.
+ *      mode:   flags.
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_flash_update_caps(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        int                     rval;
+        uint64_t                cb;
+        EXT_FLASH_UPDATE_CAPS   caps = {0};
+
+        QL_PRINT_9(ha, "started\n");
+
+        cb = LONG_TO_LLONG(ha->fw_attributes, ha->fw_ext_attributes);
+
+        switch (cmd->SubCode) {
+        case EXT_SC_GET_FLASH_UPDATE_CAPS:
+                if (cmd->ResponseLen < sizeof (EXT_FLASH_UPDATE_CAPS)) {
+                        cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+                        cmd->DetailStatus = sizeof (EXT_FLASH_UPDATE_CAPS);
+                        EL(ha, "failed, ResponseLen < 0x%x, Len=0x%x\n",
+                            sizeof (EXT_FLASH_UPDATE_CAPS), cmd->ResponseLen);
+                        cmd->ResponseLen = 0;
+                        return;
+                }
+                caps.Capabilities = cb;
+                caps.OutageDuration = 300;      /* seconds */
+
+                rval = ddi_copyout((void *)&caps,
+                    (void *)(uintptr_t)(cmd->ResponseAdr),
+                    sizeof (EXT_FLASH_UPDATE_CAPS), mode);
+                if (rval != 0) {
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                        EL(ha, "failed, ddi_copyout\n");
+                } else {
+                        cmd->ResponseLen = sizeof (EXT_FLASH_UPDATE_CAPS);
+                }
+                break;
+        case EXT_SC_SET_FLASH_UPDATE_CAPS:
+                if (cmd->RequestLen < sizeof (EXT_FLASH_UPDATE_CAPS)) {
+                        /* parameter error */
+                        EL(ha, "failed, RequestLen < EXT_FLASH_UPDATE_CAPS, "
+                            "Len=%xh\n", cmd->RequestLen);
+                        cmd->Status = EXT_STATUS_INVALID_PARAM;
+                        cmd->DetailStatus = EXT_DSTATUS_REQUEST_LEN;
+                        cmd->ResponseLen = 0;
+                        return;
+                }
+
+                /* Copy in the request structure. */
+                if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
+                    (void *)&caps, sizeof (EXT_FLASH_UPDATE_CAPS), mode) != 0) {
+                        EL(ha, "failed, ddi_copyin\n");
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                        return;
+                }
+
+                if (cb != caps.Capabilities || caps.OutageDuration < 300) {
+                        cmd->Status = EXT_STATUS_ERR;
+                        cmd->ResponseLen = 0;
+                }
+                break;
+        default:
+                /* Subcode not supported. */
+                EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+                cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+                cmd->ResponseLen = 0;
+                break;
+        }
+
+        QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_get_bbcr_data
+ *      IOCTL for get buffer to buffer credits command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    User space CT arguments pointer.
+ *      mode:   flags.
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_get_bbcr_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        int             rval;
+        ql_mbx_data_t   mr;
+        EXT_BBCR_DATA   bb = {0};
+
+        QL_PRINT_9(ha, "started\n");
+
+        if (cmd->ResponseLen < sizeof (EXT_BBCR_DATA)) {
+                cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+                cmd->DetailStatus = sizeof (EXT_BBCR_DATA);
+                EL(ha, "failed, ResponseLen < 0x%x, Len=0x%x\n",
+                    sizeof (EXT_BBCR_DATA), cmd->ResponseLen);
+                cmd->ResponseLen = 0;
+                return;
+        }
+
+        if (!(CFG_IST(ha, CFG_BBCR_SUPPORT))) {
+                EL(ha, "invalid request for HBA\n");
+                cmd->Status = EXT_STATUS_INVALID_REQUEST;
+                cmd->ResponseLen = 0;
+                return;
+        }
+        if (ha->task_daemon_flags & LOOP_DOWN) {
+                rval = ql_get_adapter_id(ha, &mr);
+                ha->bbcr_initial = LSB(mr.mb[15]);
+                ha->bbcr_runtime = MSB(mr.mb[15]);
+                bb.ConfiguredBBSCN = ha->bbcr_initial & BBCR_INITIAL_MASK;
+                bb.NegotiatedBBSCN = ha->bbcr_runtime & BBCR_RUNTIME_MASK;
+                bb.Status = EXT_DEF_BBCR_STATUS_UNKNOWN;
+                bb.State = EXT_DEF_BBCR_STATE_OFFLINE;
+                if (rval == 0x4005) {
+                        bb.mbx1 = mr.mb[1];
+                }
+        } else {
+                bb.ConfiguredBBSCN = ha->bbcr_initial & BBCR_INITIAL_MASK;
+                bb.NegotiatedBBSCN = ha->bbcr_runtime & BBCR_RUNTIME_MASK;
+
+                if (bb.ConfiguredBBSCN) {
+                        bb.Status = EXT_DEF_BBCR_STATUS_ENABLED;
+                        if (bb.NegotiatedBBSCN &&
+                            !(ha->bbcr_runtime & BBCR_RUNTIME_REJECT)) {
+                                bb.State = EXT_DEF_BBCR_STATE_ONLINE;
+                        } else {
+                                bb.State = EXT_DEF_BBCR_STATE_OFFLINE;
+                                if (ha->bbcr_runtime & BBCR_RUNTIME_REJECT) {
+                                        bb.OfflineReasonCode =
+                                            EXT_DEF_BBCR_REASON_LOGIN_REJECT;
+                                } else {
+                                        bb.OfflineReasonCode =
+                                            EXT_DEF_BBCR_REASON_SWITCH;
+                                }
+                        }
+                } else {
+                        bb.Status = EXT_DEF_BBCR_STATUS_DISABLED;
+                }
+        }
+
+        rval = ddi_copyout((void *)&bb, (void *)(uintptr_t)(cmd->ResponseAdr),
+            sizeof (EXT_BBCR_DATA), mode);
+        if (rval != 0) {
+                cmd->Status = EXT_STATUS_COPY_ERR;
+                cmd->ResponseLen = 0;
+                EL(ha, "failed, ddi_copyout\n");
+        } else {
+                cmd->ResponseLen = sizeof (EXT_BBCR_DATA);
+        }
+
+        QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_get_priv_stats
+ *      Performs EXT_SC_GET_PRIV_STATS subcommand. of EXT_CC_GET_DATA.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      cmd:    Local EXT_IOCTL cmd struct pointer.
+ *      mode:   flags.
+ *
+ * Returns:
+ *      None, request status indicated in cmd->Status.
+ *
+ * Context:
+ *      Kernel context.
+ */
+static void
+ql_get_priv_stats(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+        uint8_t *ls;
+        int     rval;
+        int     retry = 10;
+
+        QL_PRINT_9(ha, "started\n");
+
+        while (ha->task_daemon_flags & (DRIVER_STALL | ABORT_ISP_ACTIVE |
+            LOOP_RESYNC_ACTIVE)) {
+                ql_delay(ha, 10000000); /* 10 second delay */
+
+                retry--;
+
+                if (retry == 0) { /* effectively 100 seconds */
+                        EL(ha, "failed, LOOP_NOT_READY\n");
+                        cmd->Status = EXT_STATUS_BUSY;
+                        cmd->ResponseLen = 0;
+                        return;
+                }
+        }
+
+        /* Allocate memory for command. */
+        ls = kmem_zalloc(cmd->ResponseLen, KM_SLEEP);
+
+        /*
+         * I think these are supposed to be port statistics
+         * the loop ID or port ID should be in cmd->Instance.
+         */
+        rval = ql_get_status_counts(ha,
+            ha->task_daemon_flags & LOOP_DOWN ? 0xFF : ha->loop_id,
+            cmd->ResponseLen, (caddr_t)ls, 0);
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, get_link_status=%xh, id=%xh\n", rval,
+                    ha->loop_id);
+                cmd->Status = EXT_STATUS_MAILBOX;
+                cmd->DetailStatus = rval;
+                cmd->ResponseLen = 0;
+        } else {
+                rval = ddi_copyout((void *)&ls,
+                    (void *)(uintptr_t)cmd->ResponseAdr, cmd->ResponseLen,
+                    mode);
+                if (rval != 0) {
+                        EL(ha, "failed, ddi_copyout\n");
+                        cmd->Status = EXT_STATUS_COPY_ERR;
+                        cmd->ResponseLen = 0;
+                }
+        }
+
+        kmem_free(ls, cmd->ResponseLen);
+
+        QL_PRINT_9(ha, "done\n");
 }