Print this page
NEX-5733 cleanup qlt/qlc
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@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,25 +17,25 @@
  * 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.
  */
 
-#pragma ident   "Copyright 2010 QLogic Corporation; ql_mbx.c"
+#pragma ident   "Copyright 2015 QLogic Corporation; ql_mbx.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                             **
  * *                                                                    **
  * ***********************************************************************
  *
  */

@@ -44,10 +44,11 @@
 #include <ql_api.h>
 #include <ql_debug.h>
 #include <ql_iocb.h>
 #include <ql_isr.h>
 #include <ql_mbx.h>
+#include <ql_nx.h>
 #include <ql_xioctl.h>
 
 /*
  * Local data
  */

@@ -54,20 +55,21 @@
 
 /*
  * Local prototypes
  */
 static int ql_mailbox_command(ql_adapter_state_t *, mbx_cmd_t *);
-static int ql_task_mgmt_iocb(ql_adapter_state_t *, ql_tgt_t *, uint16_t,
+static int ql_task_mgmt_iocb(ql_adapter_state_t *, ql_tgt_t *, uint64_t,
     uint32_t, uint16_t);
 static int ql_abort_cmd_iocb(ql_adapter_state_t *, ql_srb_t *);
 static int ql_setup_mbox_dma_transfer(ql_adapter_state_t *, dma_mem_t *,
     caddr_t, uint32_t);
 static int ql_setup_mbox_dma_resources(ql_adapter_state_t *, dma_mem_t *,
     uint32_t);
 static void ql_setup_mbox_dma_data(dma_mem_t *, caddr_t);
 static void ql_get_mbox_dma_data(dma_mem_t *, caddr_t);
-
+static int ql_init_req_q(ql_adapter_state_t *, ql_request_q_t *, uint16_t);
+static int ql_init_rsp_q(ql_adapter_state_t *, ql_response_q_t *, uint16_t);
 /*
  * ql_mailbox_command
  *      Issue mailbox command and waits for completion.
  *
  * Input:

@@ -90,30 +92,29 @@
         uint32_t                set_flags = 0;
         uint32_t                reset_flags = 0;
         ql_adapter_state_t      *ha = vha->pha;
         int                     mbx_cmd = mcp->mb[0];
 
-        QL_PRINT_3(CE_CONT, "(%d): started, cmd=%xh\n", ha->instance, mbx_cmd);
+        QL_PRINT_3(ha, "started, cmd=%xh\n", mbx_cmd);
 
         /* Acquire mailbox register lock. */
         MBX_REGISTER_LOCK(ha);
 
         /* Check for mailbox available, if not wait for signal. */
-        while (ha->mailbox_flags & MBX_BUSY_FLG ||
-            (CFG_IST(ha, CFG_CTRL_8021) &&
-            RD32_IO_REG(ha, nx_host_int) & NX_MBX_CMD)) {
-                ha->mailbox_flags = (uint8_t)
-                    (ha->mailbox_flags | MBX_WANT_FLG);
-
+        while (ha->mailbox_flags & MBX_BUSY_FLG) {
                 if (ha->task_daemon_flags & TASK_DAEMON_POWERING_DOWN) {
-                        EL(vha, "failed availability cmd=%xh\n", mcp->mb[0]);
+                        EL(vha, "powerdown availability cmd=%xh\n", mcp->mb[0]);
                         MBX_REGISTER_UNLOCK(ha);
                         return (QL_LOCK_TIMEOUT);
                 }
+                ha->mailbox_flags = (uint8_t)
+                    (ha->mailbox_flags | MBX_WANT_FLG);
 
                 /* Set timeout after command that is running. */
-                timer = (mcp->timeout + 20) * drv_usectohz(1000000);
+                timer = ha->mailbox_flags & MBX_BUSY_FLG ?
+                    (mcp->timeout + 20) : 2;
+                timer = timer * drv_usectohz(1000000);
                 cv_stat = cv_reltimedwait_sig(&ha->cv_mbx_wait,
                     &ha->pha->mbx_mutex, timer, TR_CLOCK_TICK);
                 if (cv_stat == -1 || cv_stat == 0) {
                         /*
                          * The timeout time 'timer' was

@@ -151,22 +152,21 @@
                 data >>= 1;
         }
 
         /* Issue set host interrupt command. */
         ha->mailbox_flags = (uint8_t)(ha->mailbox_flags & ~MBX_INTERRUPT);
-        if (CFG_IST(ha, CFG_CTRL_8021)) {
+        if (CFG_IST(ha, CFG_CTRL_82XX)) {
                 WRT32_IO_REG(ha, nx_host_int, NX_MBX_CMD);
-        } else if (CFG_IST(ha, CFG_CTRL_242581)) {
+        } else if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 WRT32_IO_REG(ha, hccr, HC24_SET_HOST_INT);
         } else {
                 WRT16_IO_REG(ha, hccr, HC_SET_HOST_INT);
         }
 
         /* Wait for command to complete. */
         if (ha->flags & INTERRUPTS_ENABLED &&
-            !(ha->task_daemon_flags & (TASK_THREAD_CALLED |
-            TASK_DAEMON_POWERING_DOWN)) &&
+            !(ha->task_daemon_flags & TASK_DAEMON_POWERING_DOWN) &&
             !ddi_in_panic()) {
                 timer = mcp->timeout * drv_usectohz(1000000);
                 while (!(ha->mailbox_flags & (MBX_INTERRUPT | MBX_ABORT)) &&
                     !(ha->task_daemon_flags & ISP_ABORT_NEEDED)) {
 

@@ -175,10 +175,12 @@
                                 /*
                                  * The timeout time 'timer' was
                                  * reached without the condition
                                  * being signaled.
                                  */
+                                EL(vha, "reltimedwait expired cmd=%xh\n",
+                                    mcp->mb[0]);
                                 MBX_REGISTER_UNLOCK(ha);
                                 while (INTERRUPT_PENDING(ha)) {
                                         (void) ql_isr((caddr_t)ha);
                                         INTR_LOCK(ha);
                                         ha->intr_claimed = B_TRUE;

@@ -223,11 +225,11 @@
         /* Mailbox command timeout? */
         if (ha->task_daemon_flags & ISP_ABORT_NEEDED ||
             ha->mailbox_flags & MBX_ABORT) {
                 rval = QL_ABORTED;
         } else if ((ha->mailbox_flags & MBX_INTERRUPT) == 0) {
-                if (!CFG_IST(ha, CFG_CTRL_8021)) {
+                if (!CFG_IST(ha, CFG_CTRL_82XX)) {
                         if (CFG_IST(ha, CFG_DUMP_MAILBOX_TIMEOUT)) {
                                 (void) ql_binary_fw_dump(ha, FALSE);
                         }
                         EL(vha, "command timeout, isp_abort_needed\n");
                         set_flags |= ISP_ABORT_NEEDED;

@@ -246,11 +248,11 @@
         /*
          * Clear outbound to risc mailbox registers per spec. The exception
          * is on 2200 mailbox 4 and 5 affect the req and resp que indexes
          * so avoid writing them.
          */
-        if (ha->cfg_flags & CFG_CTRL_2200) {
+        if (CFG_IST(ha, CFG_CTRL_22XX)) {
                 data = ((mcp->out_mb & ~(MBX_4 | MBX_5)) >> 1);
         } else {
                 data = (mcp->out_mb >> 1);
         }
         for (cnt = 1; cnt < ha->reg_off->mbox_cnt && data; cnt++) {

@@ -282,11 +284,11 @@
         if (rval != QL_SUCCESS) {
                 EL(vha, "%s failed, rval=%xh, mcp->mb[0]=%xh\n",
                     mbx_cmd_text(mbx_cmd), rval, mcp->mb[0]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -425,20 +427,19 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, (CFG_CTRL_6322 | CFG_CTRL_258081)) ||
-            ha->vp_index != 0) {
+        if (!CFG_IST(ha, CFG_FCIP_SUPPORT) || ha->vp_index != 0) {
                 ha->flags &= ~IP_INITIALIZED;
                 EL(ha, "HBA does not support IP\n");
                 return (QL_FUNCTION_FAILED);
         }
 
-        ha->rcvbuf_ring_ptr = ha->rcvbuf_ring_bp;
+        ha->rcvbuf_ring_ptr = ha->rcv_ring.bp;
         ha->rcvbuf_ring_index = 0;
 
         /* Reset all sequence counts. */
         for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
                 for (link = ha->dev[index].first; link != NULL;

@@ -470,11 +471,11 @@
 
         if (rval == QL_SUCCESS) {
                 ADAPTER_STATE_LOCK(ha);
                 ha->flags |= IP_INITIALIZED;
                 ADAPTER_STATE_UNLOCK(ha);
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         } else {
                 ha->flags &= ~IP_INITIALIZED;
                 EL(ha, "failed, rval = %xh\n", rval);
         }
         return (rval);

@@ -501,11 +502,11 @@
         mbx_cmd_t       *mcp = &mc;
         fc_unsol_buf_t  *ubp;
         ql_srb_t        *sp;
         uint16_t        index;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_UNLOAD_IP;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;

@@ -527,11 +528,11 @@
         ha->flags &= ~IP_INITIALIZED;
         ADAPTER_STATE_UNLOCK(ha);
 
         if (rval == QL_SUCCESS) {
                 /* EMPTY - no need to check return value of MBC_SHUTDOWN_IP */
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         } else {
                 EL(ha, "failed, rval = %xh\n", rval);
         }
         return (rval);
 }

@@ -554,11 +555,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_ONLINE_SELF_TEST;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_0 | MBX_1 | MBX_2 | MBX_3;
         mcp->timeout = MAILBOX_TOV;

@@ -567,11 +568,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval = %xh, mb1=%xh, mb2=%xh, mb3=%xh\n",
                     rval, mcp->mb[1], mcp->mb[2], mcp->mb[3]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
         return (rval);
 }
 
 /*

@@ -596,11 +597,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK;
         mcp->mb[1] = lb->options;
         mcp->mb[2] = findex;
         mcp->mb[6] = LSW(h_rcv);

@@ -631,11 +632,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval = %xh, mb1=%xh, mb2=%xh, mb3=%xh\n",
                     rval, mcp->mb[1], mcp->mb[2], mcp->mb[3]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
         return (rval);
 }
 #else
 int

@@ -643,11 +644,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK;
         mcp->mb[1] = lb->options;
         mcp->mb[2] = findex;
         mcp->mb[6] = LSW(h_rcv);

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

@@ -714,11 +715,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_ECHO;                  /* ECHO command */
         mcp->mb[1] = echo_pt->options;          /* command options; 64 bit */
                                                 /* addressing (bit 6) and */
                                                 /* real echo (bit 15 */

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

@@ -798,11 +799,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_SEND_CHANGE_REQUEST;
         mcp->mb[1] = fmt;
         mcp->out_mb = MBX_1|MBX_0;
         if (ha->flags & VP_ENABLED) {

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

@@ -843,11 +844,11 @@
         uint16_t        size;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         /* LFA_CB sz = 4 16bit words subcommand + 10 16bit words header. */
         size = (uint16_t)((lfa->subcommand_length[0] + 10) << 1);
 
         rval = ql_setup_mbox_dma_transfer(ha, &mem_desc, (caddr_t)lfa, size);

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

@@ -888,50 +889,51 @@
  *      Issue clear ACA mailbox command.
  *
  * Input:
  *      ha:     adapter state pointer.
  *      tq:     target queue pointer.
- *      lun:    LUN.
+ *      lq:     LUN queue pointer.
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_clear_aca(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun)
+ql_clear_aca(ql_adapter_state_t *ha, ql_tgt_t *tq, ql_lun_t *lq)
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                rval = ql_task_mgmt_iocb(ha, tq, lun, CF_CLEAR_ACA, 0);
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                rval = ql_task_mgmt_iocb(ha, tq, lq->lun_addr,
+                    CF_CLEAR_ACA, 0);
         } else {
                 mcp->mb[0] = MBC_CLEAR_ACA;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = tq->loop_id;
                 } else {
                         mcp->mb[1] = (uint16_t)(tq->loop_id << 8);
                 }
-                mcp->mb[2] = lun;
+                mcp->mb[2] = lq->lun_no;
                 mcp->out_mb = MBX_2|MBX_1|MBX_0;
                 mcp->in_mb = MBX_0;
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
         }
 
-        (void) ql_marker(ha, tq->loop_id, lun, MK_SYNC_ID);
+        (void) ql_marker(ha, tq->loop_id, lq, MK_SYNC_ID);
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval = %xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -952,18 +954,30 @@
  */
 int
 ql_target_reset(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t delay)
 {
         ql_link_t       *link;
+        ql_srb_t        *sp;
         uint16_t        index;
-        int             rval;
+        int             rval = QL_SUCCESS;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        ql_requeue_pending_cmds(ha, tq);
+        INTR_LOCK(ha);
+        for (index = 1; index < ha->pha->osc_max_cnt; index++) {
+                if ((sp = ha->pha->outstanding_cmds[index]) != NULL &&
+                    sp->lun_queue != NULL &&
+                    sp->lun_queue->target_queue == tq) {
+                        sp->flags |= SRB_ABORTING;
+                }
+        }
+        INTR_UNLOCK(ha);
+
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 /* queue = NULL, all targets. */
                 if (tq == NULL) {
                         for (index = 0; index < DEVICE_HEAD_LIST_SIZE;
                             index++) {
                                 for (link = ha->dev[index].first; link !=

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

@@ -1054,17 +1068,30 @@
  *      Kernel context.
  */
 int
 ql_abort_target(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t delay)
 {
+        ql_srb_t        *sp;
+        uint16_t        index;
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        ql_requeue_pending_cmds(ha, tq);
+        INTR_LOCK(ha);
+        for (index = 1; index < ha->pha->osc_max_cnt; index++) {
+                if ((sp = ha->pha->outstanding_cmds[index]) != NULL &&
+                    sp->lun_queue != NULL &&
+                    sp->lun_queue->target_queue == tq) {
+                        sp->flags |= SRB_ABORTING;
+                }
+        }
+        INTR_UNLOCK(ha);
+
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 rval = ql_task_mgmt_iocb(ha, tq, 0,
                     CF_DO_NOT_SEND | CF_TARGET_RESET, delay);
         } else {
                 mcp->mb[0] = MBC_ABORT_TARGET;
                 /* Don't send Task Mgt */

@@ -1086,11 +1113,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
         return (rval);
 }
 
 /*

@@ -1098,50 +1125,65 @@
  *      Issue LUN reset task management mailbox command.
  *
  * Input:
  *      ha:     adapter state pointer.
  *      tq:     target queue pointer.
- *      lun:    LUN.
+ *      lq:     LUN queue pointer.
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_lun_reset(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun)
+ql_lun_reset(ql_adapter_state_t *ha, ql_tgt_t *tq, ql_lun_t *lq)
 {
+        ql_srb_t        *sp;
+        uint16_t        index;
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                rval = ql_task_mgmt_iocb(ha, tq, lun, CF_LUN_RESET, 0);
+        ql_requeue_pending_cmds(ha, tq);
+        INTR_LOCK(ha);
+        for (index = 1; index < ha->pha->osc_max_cnt; index++) {
+                if ((sp = ha->pha->outstanding_cmds[index]) != NULL &&
+                    sp->lun_queue != NULL &&
+                    sp->lun_queue->target_queue == tq &&
+                    sp->lun_queue == lq) {
+                        sp->flags |= SRB_ABORTING;
+                }
+        }
+        INTR_UNLOCK(ha);
+
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                rval = ql_task_mgmt_iocb(ha, tq, lq->lun_addr,
+                    CF_LUN_RESET, 0);
         } else {
                 mcp->mb[0] = MBC_LUN_RESET;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = tq->loop_id;
                 } else {
                         mcp->mb[1] = (uint16_t)(tq->loop_id << 8);
                 }
-                mcp->mb[2] = lun;
+                mcp->mb[2] = lq->lun_no;
                 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
                 mcp->in_mb = MBX_0;
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
         }
 
-        (void) ql_marker(ha, tq->loop_id, lun, MK_SYNC_ID);
+        (void) ql_marker(ha, tq->loop_id, lq, MK_SYNC_ID);
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
         return (rval);
 }
 
 /*

@@ -1149,50 +1191,65 @@
  *      Issue clear task set mailbox command.
  *
  * Input:
  *      ha:     adapter state pointer.
  *      tq:     target queue pointer.
- *      lun:    LUN.
+ *      lq:     LUN queue pointer.
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_clear_task_set(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun)
+ql_clear_task_set(ql_adapter_state_t *ha, ql_tgt_t *tq, ql_lun_t *lq)
 {
+        ql_srb_t        *sp;
+        uint16_t        index;
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                rval = ql_task_mgmt_iocb(ha, tq, lun, CF_CLEAR_TASK_SET, 0);
+        ql_requeue_pending_cmds(ha, tq);
+        INTR_LOCK(ha);
+        for (index = 1; index < ha->pha->osc_max_cnt; index++) {
+                if ((sp = ha->pha->outstanding_cmds[index]) != NULL &&
+                    sp->lun_queue != NULL &&
+                    sp->lun_queue->target_queue == tq &&
+                    sp->lun_queue == lq) {
+                        sp->flags |= SRB_ABORTING;
+                }
+        }
+        INTR_UNLOCK(ha);
+
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                rval = ql_task_mgmt_iocb(ha, tq, lq->lun_addr,
+                    CF_CLEAR_TASK_SET, 0);
         } else {
                 mcp->mb[0] = MBC_CLEAR_TASK_SET;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = tq->loop_id;
                 } else {
                         mcp->mb[1] = (uint16_t)(tq->loop_id << 8);
                 }
-                mcp->mb[2] = lun;
+                mcp->mb[2] = lq->lun_no;
                 mcp->out_mb = MBX_2|MBX_1|MBX_0;
                 mcp->in_mb = MBX_0;
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
         }
 
-        (void) ql_marker(ha, tq->loop_id, lun, MK_SYNC_ID);
+        (void) ql_marker(ha, tq->loop_id, lq, MK_SYNC_ID);
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1201,50 +1258,65 @@
  *      Issue abort task set mailbox command.
  *
  * Input:
  *      ha:     adapter state pointer.
  *      tq:     target queue pointer.
- *      lun:    LUN.
+ *      lq:     LUN queue pointer.
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_abort_task_set(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun)
+ql_abort_task_set(ql_adapter_state_t *ha, ql_tgt_t *tq, ql_lun_t *lq)
 {
+        ql_srb_t        *sp;
+        uint16_t        index;
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
-                rval = ql_task_mgmt_iocb(ha, tq, lun, CF_ABORT_TASK_SET, 0);
+        ql_requeue_pending_cmds(ha, tq);
+        INTR_LOCK(ha);
+        for (index = 1; index < ha->pha->osc_max_cnt; index++) {
+                if ((sp = ha->pha->outstanding_cmds[index]) != NULL &&
+                    sp->lun_queue != NULL &&
+                    sp->lun_queue->target_queue == tq &&
+                    sp->lun_queue == lq) {
+                        sp->flags |= SRB_ABORTING;
+                }
+        }
+        INTR_UNLOCK(ha);
+
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                rval = ql_task_mgmt_iocb(ha, tq, lq->lun_addr,
+                    CF_ABORT_TASK_SET, 0);
         } else {
                 mcp->mb[0] = MBC_ABORT_TASK_SET;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = tq->loop_id;
                 } else {
                         mcp->mb[1] = (uint16_t)(tq->loop_id << 8);
                 }
-                mcp->mb[2] = lun;
+                mcp->mb[2] = lq->lun_no;
                 mcp->out_mb = MBX_2|MBX_1|MBX_0;
                 mcp->in_mb = MBX_0;
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
         }
 
-        (void) ql_marker(ha, tq->loop_id, lun, MK_SYNC_ID);
+        (void) ql_marker(ha, tq->loop_id, lq, MK_SYNC_ID);
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1253,11 +1325,11 @@
  *      Function issues task management IOCB.
  *
  * Input:
  *      ha:     adapter state pointer.
  *      tq:     target queue pointer.
- *      lun:    LUN.
+ *      lun_addr:       LUN.
  *      flags:  control flags.
  *      delay:  seconds.
  *
  * Returns:
  *      ql local function return status code.

@@ -1264,18 +1336,19 @@
  *
  * Context:
  *      Kernel context
  */
 static int
-ql_task_mgmt_iocb(ql_adapter_state_t *ha, ql_tgt_t *tq, uint16_t lun,
+ql_task_mgmt_iocb(ql_adapter_state_t *ha, ql_tgt_t *tq, uint64_t lun_addr,
     uint32_t flags, uint16_t delay)
 {
         ql_mbx_iocb_t   *pkt;
         int             rval;
         uint32_t        pkt_size;
+        fcp_ent_addr_t  *fcp_ent_addr;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         pkt_size = sizeof (ql_mbx_iocb_t);
         pkt = kmem_zalloc(pkt_size, KM_SLEEP);
         if (pkt == NULL) {
                 EL(ha, "failed, kmem_zalloc\n");

@@ -1286,12 +1359,21 @@
         pkt->mgmt.entry_count = 1;
 
         pkt->mgmt.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
         pkt->mgmt.delay = (uint16_t)LE_16(delay);
         pkt->mgmt.timeout = LE_16(MAILBOX_TOV);
-        pkt->mgmt.fcp_lun[2] = LSB(lun);
-        pkt->mgmt.fcp_lun[3] = MSB(lun);
+
+        fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
+        pkt->mgmt.fcp_lun[2] = lobyte(fcp_ent_addr->ent_addr_0);
+        pkt->mgmt.fcp_lun[3] = hibyte(fcp_ent_addr->ent_addr_0);
+        pkt->mgmt.fcp_lun[0] = lobyte(fcp_ent_addr->ent_addr_1);
+        pkt->mgmt.fcp_lun[1] = hibyte(fcp_ent_addr->ent_addr_1);
+        pkt->mgmt.fcp_lun[6] = lobyte(fcp_ent_addr->ent_addr_2);
+        pkt->mgmt.fcp_lun[7] = hibyte(fcp_ent_addr->ent_addr_2);
+        pkt->mgmt.fcp_lun[4] = lobyte(fcp_ent_addr->ent_addr_3);
+        pkt->mgmt.fcp_lun[5] = hibyte(fcp_ent_addr->ent_addr_3);
+
         pkt->mgmt.control_flags = LE_32(flags);
         pkt->mgmt.target_id[0] = tq->d_id.b.al_pa;
         pkt->mgmt.target_id[1] = tq->d_id.b.area;
         pkt->mgmt.target_id[2] = tq->d_id.b.domain;
         pkt->mgmt.vp_index = ha->vp_index;

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

@@ -1342,15 +1424,15 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_LOOP_PORT_BYPASS;
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[1] = tq->d_id.b.al_pa;
         } else if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                 mcp->mb[1] = tq->loop_id;
         } else {
                 mcp->mb[1] = (uint16_t)(tq->loop_id << 8);

@@ -1363,11 +1445,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1390,15 +1472,15 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_LOOP_PORT_ENABLE;
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[1] = tq->d_id.b.al_pa;
         } else if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                 mcp->mb[1] = tq->loop_id;
         } else {
                 mcp->mb[1] = (uint16_t)(tq->loop_id << 8);

@@ -1410,11 +1492,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1443,14 +1525,14 @@
         uint16_t        flags;
         ql_mbx_data_t   mr;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started, d_id=%xh, loop_id=%xh\n",
+        QL_PRINT_3(ha, "started, d_id=%xh, loop_id=%xh\n",
             ha->instance, tq->d_id.b24, loop_id);
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 flags = CF_CMD_PLOGI;
                 if ((opt & LLF_PLOGI) == 0) {
                         flags = (uint16_t)(flags | CFO_COND_PLOGI);
                 }
                 rval = ql_log_iocb(ha, tq, loop_id, flags, &mr);

@@ -1471,11 +1553,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "d_id=%xh, loop_id=%xh, failed=%xh\n", tq->d_id.b24,
                     loop_id, rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1504,18 +1586,18 @@
         int             rval;
         uint16_t        flags;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started, d_id=%xh, loop_id=%xh\n",
+        QL_PRINT_3(ha, "started, d_id=%xh, loop_id=%xh\n",
             ha->instance, tq->d_id.b24, loop_id);
 
-        if ((tq->d_id.b24 & 0xffffff) == 0xfffffa) {
+        if ((tq->d_id.b24 & QL_PORT_ID_MASK) == FS_MANAGEMENT_SERVER) {
                 opt = (uint16_t)(opt | LFF_NO_PRLI);
         }
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 flags = CF_CMD_PLOGI;
                 if (opt & LFF_NO_PLOGI) {
                         flags = (uint16_t)(flags | CFO_COND_PLOGI);
                 }
                 if (opt & LFF_NO_PRLI) {

@@ -1548,15 +1630,16 @@
                 }
         }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "d_id=%xh, loop_id=%xh, failed=%xh, mb1=%02xh, "
-                    "mb2=%04x\n", tq->d_id.b24, loop_id, rval, mr->mb[1],
-                    mr->mb[2]);
+                    "mb2=%04x\n", tq->d_id.b24, loop_id, rval,
+                    mr != NULL ? mr->mb[1] : mcp->mb[1],
+                    mr != NULL ? mr->mb[2] : mcp->mb[2]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1581,18 +1664,35 @@
         uint16_t        flag;
         ql_mbx_data_t   mr;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started, loop_id=%xh d_id=%xh\n",
-            ha->instance, tq->loop_id, tq->d_id.b24);
+        QL_PRINT_3(ha, "started, loop_id=%xh d_id=%xh\n",
+            tq->loop_id, tq->d_id.b24);
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+                if ((ha->topology & QL_N_PORT) &&
+                    (tq->loop_id != 0x7fe) &&
+                    (tq->loop_id != 0x7ff)) {
+                        flag = (uint16_t)(CFO_IMPLICIT_LOGO |
+                            CF_CMD_LOGO | CFO_FREE_N_PORT_HANDLE);
+
+                        rval = ql_log_iocb(ha, tq, tq->loop_id, flag, &mr);
+                } else {
                 flag = (uint16_t)(RESERVED_LOOP_ID(ha, tq->loop_id) ?
-                    CFO_EXPLICIT_LOGO |CF_CMD_LOGO | CFO_FREE_N_PORT_HANDLE :
-                    CFO_IMPLICIT_LOGO |CF_CMD_LOGO | CFO_FREE_N_PORT_HANDLE);
+                            CFO_EXPLICIT_LOGO | CF_CMD_LOGO |
+                            CFO_FREE_N_PORT_HANDLE :
+                            CFO_IMPLICIT_LOGO | CF_CMD_LOGO |
+                            CFO_FREE_N_PORT_HANDLE);
+
                 rval = ql_log_iocb(ha, tq, tq->loop_id, flag, &mr);
+                }
+
+                if (rval == QL_SUCCESS) {
+                        EL(ha, "tq=%ph, loop_id=%xh, d_id=%xh, flag=%xh\n",
+                            tq, tq->loop_id, tq->d_id.b24, flag);
+                }
         } else {
                 flag = (uint16_t)(RESERVED_LOOP_ID(ha, tq->loop_id) ?  1 : 0);
                 mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = tq->loop_id;

@@ -1606,15 +1706,15 @@
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
         }
 
         if (rval != QL_SUCCESS) {
-                EL(ha, "d_id=%xh, loop_id=%xh, failed=%xh\n", rval,
+                EL(ha, "failed, rval=%xh, d_id=%xh, loop_id=%xh\n", rval,
                     tq->d_id.b24, tq->loop_id);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1641,11 +1741,11 @@
 {
         ql_mbx_iocb_t   *pkt;
         int             rval;
         uint32_t        pkt_size;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         pkt_size = sizeof (ql_mbx_iocb_t);
         pkt = kmem_zalloc(pkt_size, KM_SLEEP);
         if (pkt == NULL) {
                 EL(ha, "failed, kmem_zalloc\n");

@@ -1766,12 +1866,11 @@
                                         mr->mb[0] =
                                             MBS_COMMAND_PARAMETER_ERROR;
                                         break;
                                 }
                         } else {
-                                QL_PRINT_3(CE_CONT, "(%d): status=%xh\n",
-                                    ha->instance, pkt->log.status);
+                                QL_PRINT_3(ha, "status=%xh\n", pkt->log.status);
 
                                 mr->mb[0] = MBS_COMMAND_COMPLETE;
                                 mr->mb[1] = (uint16_t)
                                     (pkt->log.io_param[0] & BIT_4 ? 0 : BIT_0);
                                 if (pkt->log.io_param[0] & BIT_8) {

@@ -1785,14 +1884,15 @@
         }
 
         kmem_free(pkt, pkt_size);
 
         if (rval != QL_SUCCESS) {
-                EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
+                EL(ha, "failed, rval=%xh, d_id=%xh loop_id=%xh\n",
+                    rval, tq->d_id.b24, loop_id);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1819,11 +1919,11 @@
         dma_mem_t               mem_desc;
         mbx_cmd_t               mc = {0};
         mbx_cmd_t               *mcp = &mc;
         port_database_23_t      *pd23;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         pd23 = (port_database_23_t *)kmem_zalloc(PORT_DATABASE_SIZE, KM_SLEEP);
         if (pd23 == NULL) {
                 rval = QL_MEMORY_ALLOC_FAILED;
                 EL(ha, "failed, rval = %xh\n", rval);

@@ -1833,11 +1933,11 @@
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             PORT_DATABASE_SIZE)) != QL_SUCCESS) {
                 return (QL_MEMORY_ALLOC_FAILED);
         }
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[0] = MBC_GET_PORT_DATABASE;
                 mcp->mb[1] = tq->loop_id;
                 mcp->mb[4] = CHAR_TO_SHORT(tq->d_id.b.al_pa, tq->d_id.b.area);
                 mcp->mb[5] = (uint16_t)tq->d_id.b.domain;
                 mcp->mb[9] = ha->vp_index;

@@ -1871,11 +1971,11 @@
         }
 
         ql_free_dma_resource(ha, &mem_desc);
 
         if (rval == QL_SUCCESS) {
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         port_database_24_t *pd24 = (port_database_24_t *)pd23;
 
                         tq->master_state = pd24->current_login_state;
                         tq->slave_state = pd24->last_stable_login_state;
                         if (PD_PORT_LOGIN(tq)) {

@@ -1963,16 +2063,19 @@
                 }
         }
 
         kmem_free(pd23, PORT_DATABASE_SIZE);
 
-        if ((rval != QL_SUCCESS) && (rval != QL_PARAMETER_ERROR)) {
-                EL(ha, "d_id=%xh, loop_id=%xh, failed=%xh\n", tq->d_id.b24,
-                    tq->loop_id, rval);
+        /*
+         * log the trace in any cases other than QL_SUCCESS.
+         */
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, rval=%xh, d_id=%xh, loop_id=%xh\n",
+                    rval, tq->d_id.b24, tq->loop_id);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -1997,11 +2100,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             (uint32_t)size)) != QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_resources failed: %xh\n", rval);
                 return (QL_MEMORY_ALLOC_FAILED);

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

@@ -2054,11 +2157,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_transfer(ha, &mem_desc, bufp,
             (uint32_t)size)) != QL_SUCCESS) {
                 EL(ha, "failed, setup_mbox_dma_transfer: %x\n", rval);
                 return (rval);

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

@@ -2110,19 +2213,19 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             (uint32_t)size)) != QL_SUCCESS) {
                 return (QL_MEMORY_ALLOC_FAILED);
         }
 
         mcp->mb[0] = MBC_SEND_RNID_ELS;
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[1] = loop_id;
                 mcp->mb[9] = ha->vp_index;
                 mcp->mb[10] = opt;
                 mcp->out_mb = MBX_10|MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
         } else if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {

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

@@ -2178,11 +2281,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             (uint32_t)size)) != QL_SUCCESS) {
                 return (QL_MEMORY_ALLOC_FAILED);
         }

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

@@ -2238,21 +2341,21 @@
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
         int             rval = QL_SUCCESS;
         int             retry = 0;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         do {
                 if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
                     (uint32_t)size)) != QL_SUCCESS) {
                         EL(ha, "setup_mbox_dma_resources failed: %xh\n", rval);
                         return (QL_MEMORY_ALLOC_FAILED);
                 }
 
                 mcp->mb[0] = MBC_GET_LINK_STATUS;
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         if (loop_id == ha->loop_id) {
                                 mcp->mb[0] = MBC_GET_STATUS_COUNTS;
                                 mcp->mb[8] = (uint16_t)(size >> 2);
                                 mcp->out_mb = MBX_10|MBX_8;
                         } else {

@@ -2304,11 +2407,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -2336,27 +2439,27 @@
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
         int             rval = QL_SUCCESS;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             (uint32_t)size)) != QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_resources failed: %x\n", rval);
                 return (QL_MEMORY_ALLOC_FAILED);
         }
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[0] = MBC_GET_STATUS_COUNTS;
                 mcp->mb[8] = (uint16_t)(size / 4);
                 mcp->out_mb = MBX_10|MBX_8;
         } else {
                 mcp->mb[0] = MBC_GET_LINK_STATUS;
 
                 /* allows reporting when link is down */
-                if (CFG_IST(ha, CFG_CTRL_2200) == 0) {
+                if (CFG_IST(ha, CFG_CTRL_22XX) == 0) {
                         port_no = (uint8_t)(port_no | BIT_6);
                 }
 
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = loop_id;

@@ -2386,11 +2489,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, mbx1=%xh, mbx2=%xh\n", rval,
                     mcp->mb[1], mcp->mb[2]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -2412,11 +2515,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_RESET_LINK_STATUS;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;

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

@@ -2448,11 +2551,11 @@
 int
 ql_loop_reset(ql_adapter_state_t *ha)
 {
         int     rval;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if (CFG_IST(ha, CFG_ENABLE_LIP_RESET)) {
                 rval = ql_lip_reset(ha, 0xff);
         } else if (CFG_IST(ha, CFG_ENABLE_FULL_LIP_LOGIN)) {
                 rval = ql_full_login_lip(ha);

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

@@ -2490,16 +2593,20 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
+                ql_toggle_loop_state(ha);
+                QL_PRINT_3(ha, "8081 done\n");
+                return (QL_SUCCESS);
+        }
+        if (CFG_IST(ha, CFG_FC_TYPE_2)) {
                 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
-                mcp->mb[1] = (uint16_t)(CFG_IST(ha, CFG_CTRL_8081) ?
-                    BIT_1 : BIT_4);
+                mcp->mb[1] = BIT_4;
                 mcp->mb[3] = ha->loop_reset_delay;
                 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
         } else {
                 mcp->mb[0] = MBC_INITIATE_LIP;
                 mcp->out_mb = MBX_0;

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

@@ -2536,17 +2643,20 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
+                ql_toggle_loop_state(ha);
+                QL_PRINT_3(ha, "8081 done\n");
+                return (QL_SUCCESS);
+        }
         mcp->mb[0] = MBC_LIP_FULL_LOGIN;
-        if (CFG_IST(ha, CFG_CTRL_2425)) {
+        if (CFG_IST(ha, CFG_FC_TYPE_2)) {
                 mcp->mb[1] = BIT_3;
-        } else if (CFG_IST(ha, CFG_CTRL_8081)) {
-                mcp->mb[1] = BIT_1;
         }
         mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);

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

@@ -2580,16 +2690,21 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
+                ql_toggle_loop_state(ha);
+                QL_PRINT_3(ha, "8081 done\n");
+                return (QL_SUCCESS);
+        }
+
+        if (CFG_IST(ha, CFG_FC_TYPE_2)) {
                 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
-                mcp->mb[1] = (uint16_t)(CFG_IST(ha, CFG_CTRL_8081) ?
-                    BIT_1 : BIT_6);
+                mcp->mb[1] = BIT_6;
                 mcp->mb[3] = ha->loop_reset_delay;
                 mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
         } else {
                 mcp->mb[0] = MBC_LIP_RESET;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {

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

@@ -2635,13 +2750,14 @@
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
         ql_tgt_t        *tq = sp->lun_queue->target_queue;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        sp->flags |= SRB_ABORTING;
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 rval = ql_abort_cmd_iocb(ha, sp);
         } else {
                 mcp->mb[0] = MBC_ABORT_COMMAND_IOCB;
                 if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
                         mcp->mb[1] = tq->loop_id;

@@ -2661,11 +2777,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh, handle=%xh\n", rval,
                     tq->d_id.b24, sp->handle);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -2690,11 +2806,11 @@
         int             rval;
         uint32_t        pkt_size;
         uint16_t        comp_status;
         ql_tgt_t        *tq = sp->lun_queue->target_queue;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         pkt_size = sizeof (ql_mbx_iocb_t);
         if ((pkt = kmem_zalloc(pkt_size, KM_SLEEP)) == NULL) {
                 EL(ha, "failed, kmem_zalloc\n");
                 return (QL_MEMORY_ALLOC_FAILED);

@@ -2701,11 +2817,11 @@
         }
 
         pkt->abo.entry_type = ABORT_CMD_TYPE;
         pkt->abo.entry_count = 1;
         pkt->abo.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
-        if (!CFG_IST(ha, CFG_CTRL_8021)) {
+        if (!CFG_IST(ha, CFG_CTRL_82XX)) {
                 pkt->abo.options = AF_NO_ABTS;
         }
         pkt->abo.cmd_handle = LE_32(sp->handle);
         pkt->abo.target_id[0] = tq->d_id.b.al_pa;
         pkt->abo.target_id[1] = tq->d_id.b.area;

@@ -2733,11 +2849,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, d_id=%xh\n", rval, tq->d_id.b24);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -2759,14 +2875,14 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_VERIFY_CHECKSUM;
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[1] = MSW(ha->risc_fw[0].addr);
                 mcp->mb[2] = LSW(ha->risc_fw[0].addr);
         } else {
                 mcp->mb[1] = LSW(ha->risc_fw[0].addr);
         }

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

@@ -2808,20 +2924,20 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             (uint32_t)size)) != QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_resources failed: %xh\n", rval);
                 return (QL_MEMORY_ALLOC_FAILED);
         }
 
         mcp->mb[0] = MBC_GET_ID_LIST;
-        if (CFG_IST(ha, CFG_CTRL_24258081)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[2] = MSW(LSD(mem_desc.cookie.dmac_laddress));
                 mcp->mb[3] = LSW(LSD(mem_desc.cookie.dmac_laddress));
                 mcp->mb[6] = MSW(MSD(mem_desc.cookie.dmac_laddress));
                 mcp->mb[7] = LSW(MSD(mem_desc.cookie.dmac_laddress));
                 mcp->mb[8] = (uint16_t)size;

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

@@ -2882,39 +2998,37 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_242581)) {
+        mcp->mb[1] = LSW(risc_address);
+        mcp->mb[2] = MSW(LSD(bp));
+        mcp->mb[3] = LSW(LSD(bp));
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[0] = MBC_LOAD_RAM_EXTENDED;
                 mcp->mb[4] = MSW(word_count);
                 mcp->mb[5] = LSW(word_count);
-                mcp->mb[6] = MSW(MSD(bp));
-                mcp->mb[7] = LSW(MSD(bp));
                 mcp->mb[8] = MSW(risc_address);
-                mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|
-                    MBX_0;
+                mcp->out_mb = MBX_0_THRU_8;
         } else {
-                mcp->mb[0] = MBC_LOAD_RAM;
+                mcp->mb[0] = MBC_LOAD_RISC_RAM;
                 mcp->mb[4] = LSW(word_count);
-                mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+                mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
         }
-        mcp->mb[1] = LSW(risc_address);
-        mcp->mb[2] = MSW(LSD(bp));
-        mcp->mb[3] = LSW(LSD(bp));
+        mcp->mb[6] = MSW(MSD(bp));
+        mcp->mb[7] = LSW(MSD(bp));
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
-
         rval = ql_mailbox_command(ha, mcp);
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval = %xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -2940,13 +3054,13 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_242581)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[0] = MBC_DUMP_RAM_EXTENDED;
                 mcp->mb[1] = LSW(risc_address);
                 mcp->mb[2] = MSW(LSD(bp));
                 mcp->mb[3] = LSW(LSD(bp));
                 mcp->mb[4] = MSW(word_count);

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

@@ -2999,11 +3113,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_WRITE_RAM_EXTENDED;
         mcp->mb[1] = LSW(risc_address);
         mcp->mb[2] = LSW(data);
         mcp->mb[3] = MSW(data);

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

@@ -3045,11 +3159,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_READ_RAM_EXTENDED;
         mcp->mb[1] = LSW(risc_address);
         mcp->mb[8] = MSW(risc_address);
         mcp->out_mb = MBX_8|MBX_1|MBX_0;

@@ -3060,14 +3174,14 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed, rval = %xh\n", rval);
         } else {
                 *data = mcp->mb[2];
-                if (CFG_IST(ha, CFG_CTRL_24258081)) {
+                if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                         *data |= mcp->mb[3] << 16;
                 }
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3092,11 +3206,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_transfer(ha, &mem_desc, bp, size)) !=
             QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_transfer failed: %x\n", rval);
                 return (rval);

@@ -3120,11 +3234,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3147,43 +3261,64 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started cfg=0x%llx\n", ha->cfg_flags);
 
-        if (mr != NULL) {
                 mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
+        if (mr == NULL) {
+                mcp->mb[1] = 0xAAAA;
+                mcp->mb[2] = 0x5555;
+                mcp->mb[3] = 0xAA55;
+                mcp->mb[4] = 0x55AA;
+                mcp->mb[5] = 0xA5A5;
+                mcp->mb[6] = 0x5A5A;
+                mcp->mb[7] = 0x2525;
+        } else {
                 mcp->mb[1] = mr->mb[1];
                 mcp->mb[2] = mr->mb[2];
                 mcp->mb[3] = mr->mb[3];
                 mcp->mb[4] = mr->mb[4];
                 mcp->mb[5] = mr->mb[5];
                 mcp->mb[6] = mr->mb[6];
                 mcp->mb[7] = mr->mb[7];
+        }
                 mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
                 mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
                 if (rval == QL_SUCCESS) {
-                        mr->mb[1] = mcp->mb[1];
-                        mr->mb[2] = mcp->mb[2];
-                        mr->mb[3] = mcp->mb[3];
-                        mr->mb[4] = mcp->mb[4];
-                        mr->mb[5] = mcp->mb[5];
-                        mr->mb[6] = mcp->mb[6];
-                        mr->mb[7] = mcp->mb[7];
+                if (mr == NULL) {
+                        if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
+                            mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA) {
+                                rval = QL_FUNCTION_FAILED;
                 }
+                        if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
+                            mcp->mb[7] != 0x2525) {
+                                rval = QL_FUNCTION_FAILED;
+                        }
         } else {
-                rval = QL_FUNCTION_PARAMETER_ERROR;
+                        if (mcp->mb[1] != mr->mb[1] ||
+                            mcp->mb[2] != mr->mb[2] ||
+                            mcp->mb[3] != mr->mb[3] ||
+                            mcp->mb[4] != mr->mb[4]) {
+                                rval = QL_FUNCTION_FAILED;
         }
+                        if (mcp->mb[5] != mr->mb[5] ||
+                            mcp->mb[6] != mr->mb[6] ||
+                            mcp->mb[7] != mr->mb[7]) {
+                                rval = QL_FUNCTION_FAILED;
+                        }
+                }
+        }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3205,18 +3340,18 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_8021)) {
+        if (CFG_IST(ha, CFG_CTRL_82XX)) {
                 return (QL_SUCCESS);
         }
 
         mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
-        if (CFG_IST(ha, CFG_CTRL_242581)) {
+        if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 mcp->mb[1] = MSW(ha->risc_fw[0].addr);
                 mcp->mb[2] = LSW(ha->risc_fw[0].addr);
         } else {
                 mcp->mb[1] = LSW(ha->risc_fw[0].addr);
         }

@@ -3226,19 +3361,19 @@
         mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
-        if (CFG_IST(ha, CFG_CTRL_2200)) {
+        if (CFG_IST(ha, CFG_CTRL_22XX)) {
                 rval = QL_SUCCESS;
         }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3261,11 +3396,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_GET_FIRMWARE_OPTIONS;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->timeout = MAILBOX_TOV;

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

@@ -3308,11 +3443,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if (mr != NULL) {
                 mcp->mb[0] = MBC_SET_FIRMWARE_OPTIONS;
                 mcp->mb[1] = mr->mb[1];
                 mcp->mb[2] = mr->mb[2];

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

@@ -3355,25 +3490,35 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
-        if (CFG_IST(ha, CFG_CTRL_8021)) {
+        if (ha->flags & MULTI_QUEUE) {
+                WR32_MBAR_REG(ha, ha->req_q[0]->mbar_req_in, 0);
+                WR32_MBAR_REG(ha, ha->rsp_queues[0]->mbar_rsp_out, 0);
+        } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
+                ql_8021_wr_req_in(ha, 0);
                 WRT32_IO_REG(ha, req_out, 0);
                 WRT32_IO_REG(ha, resp_in, 0);
                 WRT32_IO_REG(ha, resp_out, 0);
-        } else if (CFG_IST(ha, CFG_CTRL_242581)) {
+        } else if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
                 WRT32_IO_REG(ha, req_in, 0);
                 WRT32_IO_REG(ha, resp_out, 0);
                 WRT32_IO_REG(ha, pri_req_in, 0);
                 WRT32_IO_REG(ha, atio_req_out, 0);
         } else {
                 WRT16_IO_REG(ha, req_in, 0);
                 WRT16_IO_REG(ha, resp_out, 0);
         }
+        if (ha->req_q[0]->req_out_shadow_ptr) {
+                *ha->req_q[0]->req_out_shadow_ptr = 0;
+        }
+        if (ha->rsp_queues[0]->rsp_in_shadow_ptr) {
+                *ha->rsp_queues[0]->rsp_in_shadow_ptr = 0;
+        }
 
         if ((rval = ql_setup_mbox_dma_transfer(ha, &mem_desc,
             (caddr_t)&ha->init_ctrl_blk, sizeof (ql_comb_init_cb_t))) !=
             QL_SUCCESS) {
                 EL(ha, "dma setup failed=%xh\n", rval);

@@ -3382,19 +3527,19 @@
 
         mcp->mb[0] = (uint16_t)(ha->flags & VP_ENABLED ?
             MBC_INITIALIZE_MULTI_ID_FW : MBC_INITIALIZE_FIRMWARE);
 
         if (CFG_IST(ha, CFG_SBUS_CARD)) {
-                mcp->mb[1] = (uint16_t)(CFG_IST(ha, CFG_CTRL_2200) ?
+                mcp->mb[1] = (uint16_t)(CFG_IST(ha, CFG_CTRL_22XX) ?
                     0x204c : 0x52);
         }
 
         mcp->mb[2] = MSW(LSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[3] = LSW(LSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[6] = MSW(MSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[7] = LSW(MSD(mem_desc.cookie.dmac_laddress));
-        if (CFG_IST(ha, CFG_CTRL_8081)) {
+        if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
                 uint64_t                ofst, addr;
                 ql_init_24xx_cb_t       *icb = (ql_init_24xx_cb_t *)
                     &ha->init_ctrl_blk.cb24;
 
                 mcp->mb[0] = MBC_INITIALIZE_MULTI_ID_FW;

@@ -3417,18 +3562,46 @@
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
         if (rval == QL_SUCCESS) {
                 ha->sfp_stat = mcp->mb[2];
+                if (CFG_IST(ha, CFG_CTRL_82XX)) {
+                        (void) ql_8021_get_md_template(ha);
+                } else {
+                        uint16_t        i, opt;
+
+                        opt = ha->flags & NO_INTR_HANDSHAKE ?
+                            IMO_NONE : IMO_INTERRUPT_HANDSHAKE;
+                        if (ha->flags & QUEUE_SHADOW_PTRS) {
+                                opt |= IMO_QUEUE_POINTER_SHADOWING;
         }
+                        /* Initialize ha multi-response-queue request queue */
+                        if (ha->rsp_queues_cnt > 1) {
+                                rval = ql_init_req_q(ha, ha->req_q[1], opt);
+                                if (rval != QL_SUCCESS) {
+                                        EL(ha, "ql_init_req_q=%xh\n", rval);
+                                        return (rval);
+                                }
+                        }
+                        /* Initialize multi-response queues */
+                        for (i = 1; i < ha->rsp_queues_cnt; i++) {
+                                rval = ql_init_rsp_q(ha, ha->rsp_queues[i],
+                                    opt);
+                                if (rval != QL_SUCCESS) {
+                                        EL(ha, "ql_init_rsp_q=%xh\n", rval);
+                                        return (rval);
+                                }
+                        }
+                }
+        }
         ql_free_dma_resource(ha, &mem_desc);
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3451,34 +3624,43 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
         mcp->out_mb = MBX_0;
-        mcp->in_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+        mcp->in_mb = MBX_0_THRU_6;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
+        ha->fw_state[0] = mcp->mb[0];
+        ha->fw_state[1] = mcp->mb[1];
+        ha->fw_state[2] = mcp->mb[2];
+        ha->fw_state[3] = mcp->mb[3];
+        ha->fw_state[4] = mcp->mb[4];
+        ha->fw_state[5] = mcp->mb[5];
+        ha->fw_state[6] = mcp->mb[6];
+
         /* Return mailbox data. */
         if (mr != NULL) {
                 mr->mb[1] = mcp->mb[1];
                 mr->mb[2] = mcp->mb[2];
                 mr->mb[3] = mcp->mb[3];
                 mr->mb[4] = mcp->mb[4];
                 mr->mb[5] = mcp->mb[5];
+                mr->mb[6] = mcp->mb[6];
         }
 
         ha->sfp_stat = mcp->mb[2];
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3497,49 +3679,38 @@
  *      Kernel context.
  */
 int
 ql_get_adapter_id(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
 {
-        int             rval;
+        int             i, rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_GET_ID;
         if (ha->flags & VP_ENABLED) {
                 mcp->mb[9] = ha->vp_index;
         }
         mcp->out_mb = MBX_9|MBX_0;
-        mcp->in_mb = MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|
-            MBX_3|MBX_2|MBX_1|MBX_0;
+        mcp->in_mb = MBX_0_THRU_19;
         mcp->timeout = MAILBOX_TOV;
 
         rval = ql_mailbox_command(ha, mcp);
 
         /* Return mailbox data. */
         if (mr != NULL) {
-                mr->mb[1] = mcp->mb[1];
-                mr->mb[1] = (uint16_t)(CFG_IST(ha, CFG_CTRL_24258081) ?
-                    0xffff : mcp->mb[1]);
-                mr->mb[2] = mcp->mb[2];
-                mr->mb[3] = mcp->mb[3];
-                mr->mb[6] = mcp->mb[6];
-                mr->mb[7] = mcp->mb[7];
-                mr->mb[8] = mcp->mb[8];
-                mr->mb[9] = mcp->mb[9];
-                mr->mb[10] = mcp->mb[10];
-                mr->mb[11] = mcp->mb[11];
-                mr->mb[12] = mcp->mb[12];
-                mr->mb[13] = mcp->mb[13];
+                for (i = 0; i < 20; i++) {
+                        mr->mb[i] = mcp->mb[i];
         }
+        }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3558,44 +3729,43 @@
  *      Kernel context.
  */
 int
 ql_get_fw_version(ql_adapter_state_t *ha, ql_mbx_data_t *mr, uint16_t timeout)
 {
-        int             rval;
+        int             rval, i;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_ABOUT_FIRMWARE;
         mcp->out_mb = MBX_0;
-        mcp->in_mb = MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_6|MBX_5|
-            MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+        if (CFG_IST(ha, CFG_CTRL_83XX)) {
+                mcp->in_mb = MBX_0_THRU_17;
+        } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+                mcp->in_mb = MBX_0_THRU_25;
+        } else {
+                mcp->in_mb = MBX_0_THRU_13;
+        }
         mcp->timeout = timeout;
         rval = ql_mailbox_command(ha, mcp);
 
         /* Return mailbox data. */
         if (mr != NULL) {
-                mr->mb[1] = mcp->mb[1];
-                mr->mb[2] = mcp->mb[2];
-                mr->mb[3] = mcp->mb[3];
-                mr->mb[4] = mcp->mb[4];
-                mr->mb[5] = mcp->mb[5];
-                mr->mb[6] = mcp->mb[6];
-                mr->mb[8] = mcp->mb[8];
-                mr->mb[9] = mcp->mb[9];
-                mr->mb[10] = mcp->mb[10];
-                mr->mb[11] = mcp->mb[11];
-                mr->mb[12] = mcp->mb[12];
-                mr->mb[13] = mcp->mb[13];
+                for (i = 0; i < ha->reg_off->mbox_cnt && mcp->in_mb; i++) {
+                        if (mcp->in_mb & MBX_0) {
+                                mr->mb[i] = mcp->mb[i];
         }
+                        mcp->in_mb >>= 1;
+                }
+        }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3618,24 +3788,25 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if (mr != NULL) {
                 mcp->mb[0] = MBC_DATA_RATE;
                 mcp->mb[1] = mr->mb[1];
                 mcp->mb[2] = mr->mb[2];
                 mcp->out_mb = MBX_2|MBX_1|MBX_0;
-                mcp->in_mb = MBX_2|MBX_1|MBX_0;
+                mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
                 mcp->timeout = MAILBOX_TOV;
                 rval = ql_mailbox_command(ha, mcp);
 
                 /* Return mailbox data. */
                 mr->mb[1] = mcp->mb[1];
                 mr->mb[2] = mcp->mb[2];
+                mr->mb[3] = mcp->mb[3];
         } else {
                 rval = QL_FUNCTION_PARAMETER_ERROR;
         }
 
         ha->sfp_stat = mcp->mb[2];

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

@@ -3654,11 +3825,10 @@
  * ql_Diag_Loopback
  *      Issue Reset Link Status mailbox command
  *
  * Input:
  *      ha:     adapter state pointer.
- *      findex: FCF index.
  *      bp:     buffer pointer.
  *      size:   buffer size.
  *      opt:    command options.
  *      it_cnt: iteration count.
  *      mr:     pointer for mailbox data.

@@ -3668,29 +3838,29 @@
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_diag_loopback(ql_adapter_state_t *ha, uint16_t findex, caddr_t bp,
-    uint32_t size, uint16_t opt, uint32_t it_cnt, ql_mbx_data_t *mr)
+ql_diag_loopback(ql_adapter_state_t *ha, caddr_t bp, uint32_t size,
+    uint16_t opt, uint32_t it_cnt, ql_mbx_data_t *mr)
 {
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_transfer(ha, &mem_desc, bp, size)) !=
             QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_transfer failed: %x\n", rval);
                 return (rval);
         }
 
         mcp->mb[0] = MBC_DIAGNOSTIC_LOOP_BACK;
         mcp->mb[1] = opt;
-        mcp->mb[2] = findex;
+        mcp->mb[2] = ha->fcoe_fcf_idx;
         mcp->mb[6] = LSW(MSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[7] = MSW(MSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[10] = LSW(size);
         mcp->mb[11] = MSW(size);
         mcp->mb[14] = LSW(LSD(mem_desc.cookie.dmac_laddress));

@@ -3728,11 +3898,11 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, mb1=%xh\n", rval, mcp->mb[1]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3740,11 +3910,10 @@
  * ql_diag_echo
  *      Issue Diag echo mailbox command.  Valid for qla23xx HBA's.
  *
  * Input:
  *      ha:     adapter state pointer.
- *      findex: FCF index.
  *      bp:     buffer pointer.
  *      size:   buffer size.
  *      opt:    command options.
  *      mr:     pointer to mailbox status.
  *

@@ -3753,29 +3922,29 @@
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_diag_echo(ql_adapter_state_t *ha, uint16_t findex, caddr_t bp,
-    uint32_t size, uint16_t opt, ql_mbx_data_t *mr)
+ql_diag_echo(ql_adapter_state_t *ha, caddr_t bp, uint32_t size, uint16_t opt,
+    ql_mbx_data_t *mr)
 {
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_transfer(ha, &mem_desc, bp, size)) !=
             QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_transfer failed: %x\n", rval);
                 return (rval);
         }
 
         mcp->mb[0] = MBC_ECHO;
         mcp->mb[1] = opt;
-        mcp->mb[2] = findex;
+        mcp->mb[2] = ha->fcoe_fcf_idx;
         mcp->mb[6] = LSW(MSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[7] = MSW(MSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[10] = LSW(size);
         mcp->mb[14] = LSW(LSD(mem_desc.cookie.dmac_laddress));
         mcp->mb[15] = MSW(LSD(mem_desc.cookie.dmac_laddress));

@@ -3802,17 +3971,65 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh, mb1=%xh\n", rval,
                     mcp->mb[1]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 
 /*
+ * ql_diag_beacon
+ *      Enable/Disable beaconing via mailbox command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mr:     pointer to mailbox in/out parameters.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_diag_beacon(ql_adapter_state_t *ha, int cmd, ql_mbx_data_t *mr)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        mcp->mb[0] = MBC_SET_LED_CONFIG;
+        if (cmd == QL_BEACON_ENABLE) {
+                mcp->mb[7] = 0xE;
+        } else if (cmd == QL_BEACON_DISABLE) {
+                mcp->mb[7] = 0xD;
+        } else {
+                return (EIO);
+        }
+        mcp->out_mb = MBX_7|MBX_0;
+        mcp->in_mb = MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+
+        rval = ql_mailbox_command(ha, mcp);
+
+        /* Return mailbox data. */
+        if (mr != NULL) {
+                mr->mb[0] = mcp->mb[0];
+        }
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed=%xh\n", rval);
+        }
+
+        return (rval);
+}
+
+
+/*
  * ql_serdes_param
  *      Set/Get serdes transmit parameters mailbox command.
  *
  * Input:
  *      ha:     adapter state pointer.

@@ -3829,11 +4046,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_SERDES_TRANSMIT_PARAMETERS;
         mcp->mb[1] = mr->mb[1];
         mcp->mb[2] = mr->mb[2];
         mcp->mb[3] = mr->mb[3];

@@ -3842,22 +4059,20 @@
         mcp->in_mb = MBX_4|MBX_3|MBX_2|MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
         /* Return mailbox data. */
-        if (mr != NULL) {
                 mr->mb[0] = mcp->mb[0];
                 mr->mb[2] = mcp->mb[2];
                 mr->mb[3] = mcp->mb[3];
                 mr->mb[4] = mcp->mb[4];
-        }
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -3880,20 +4095,21 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_GET_TIMEOUT_PARAMETERS;
-        mcp->out_mb = MBX_0;
+        mcp->mb[1] = ha->fcoe_fcf_idx;
+        mcp->out_mb = MBX_1|MBX_0;
         mcp->in_mb = MBX_3|MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
         if (rval == QL_SUCCESS) {
                 /* Get 2 * R_A_TOV in seconds */
-                if (CFG_IST(ha, CFG_CTRL_2200) || mcp->mb[3] == 0) {
+                if (CFG_IST(ha, CFG_CTRL_22XX) || mcp->mb[3] == 0) {
                         *tov = R_A_TOV_DEFAULT;
                 } else {
                         *tov = (uint16_t)(mcp->mb[3] / 10);
                         if (mcp->mb[3] % 10 != 0) {
                                 *tov = (uint16_t)(*tov + 1);

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

@@ -3936,11 +4152,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_STOP_FIRMWARE;
         mcp->out_mb = MBX_1|MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = 2;

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

@@ -3962,11 +4178,11 @@
  *
  * Input:
  *      ha:     adapter state pointer.
  *      mem:    pointer to dma memory object for command.
  *      dev:    Device address (A0h or A2h).
- *      addr:   Data address on SFP EEPROM (0–255).
+ *      addr:   Data address on SFP EEPROM (0-255).
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:

@@ -3978,11 +4194,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_READ_SFP;
         mcp->mb[1] = dev;
         mcp->mb[2] = MSW(mem->cookies->dmac_address);
         mcp->mb[3] = LSW(mem->cookies->dmac_address);

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

@@ -4032,11 +4248,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_PORT_PARAM;
         mcp->mb[1] = loop_id;
         mcp->mb[2] = (uint16_t)option;
         mcp->out_mb = MBX_0|MBX_1|MBX_2;

@@ -4057,11 +4273,11 @@
         } else {
                 if (option == 0) {
                         *idma_rate = mcp->mb[3];
                 }
 
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -4083,11 +4299,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_XMIT_PARM;
         mcp->mb[1] = BIT_1;
         mcp->out_mb = MBX_1|MBX_0;
         mcp->in_mb = MBX_0;

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

@@ -4109,27 +4325,29 @@
  *
  * Input:
  *      ha:     adapter state pointer.
  *      mem:    pointer to dma memory object for command.
  *      opt:    options and opcode.
+ *      mr:     pointer to mailbox in/out parameters.
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_fw_etrace(ql_adapter_state_t *ha, dma_mem_t *mem, uint16_t opt)
+ql_fw_etrace(ql_adapter_state_t *ha, dma_mem_t *mem, uint16_t opt,
+    ql_mbx_data_t *mr)
 {
         int             rval = QL_SUCCESS;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
         uint16_t        op_code;
         uint64_t        time;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         /* currently no supported options */
         op_code = (uint16_t)(opt & ~0xFF00);
 
         mcp->mb[0] = MBC_TRACE_CONTROL;

@@ -4192,15 +4410,29 @@
 
         if (rval == QL_SUCCESS) {
                 rval = ql_mailbox_command(ha, mcp);
         }
 
+        /* Return mailbox data. */
+        if (mr != NULL) {
+                mr->mb[0] = mcp->mb[0];
+                mr->mb[1] = mcp->mb[1];
+                mr->mb[2] = mcp->mb[2];
+                mr->mb[3] = mcp->mb[3];
+                mr->mb[4] = mcp->mb[4];
+                mr->mb[5] = mcp->mb[5];
+                mr->mb[6] = mcp->mb[6];
+                mr->mb[7] = mcp->mb[7];
+                mr->mb[8] = mcp->mb[8];
+                mr->mb[9] = mcp->mb[9];
+        }
+
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -4224,11 +4456,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_RESET_MENLO;
         mcp->mb[1] = opt;
         mcp->out_mb = MBX_1|MBX_0;
         mcp->in_mb = MBX_1|MBX_0;

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

@@ -4270,11 +4502,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_RESTART_MPI;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_1|MBX_0;
         mcp->timeout = MAILBOX_TOV;

@@ -4283,11 +4515,11 @@
         /* Return mailbox data. */
         if (rval != QL_SUCCESS) {
                 EL(ha, "status=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -4310,11 +4542,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_IDC_REQUEST;
         mcp->mb[1] = mr->mb[1];
         mcp->mb[2] = mr->mb[2];
         mcp->mb[3] = mr->mb[3];

@@ -4326,14 +4558,12 @@
         mcp->in_mb = MBX_2|MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
         if (rval == QL_SUCCESS) {
-                if (mr != NULL) {
                         mr->mb[2] = mcp->mb[2];
-                }
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         } else {
                 EL(ha, "status=%xh, mbx2=%xh\n", rval, mcp->mb[2]);
         }
 
         return (rval);

@@ -4357,11 +4587,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_IDC_ACK;
         mcp->mb[1] = ha->idc_mb[1];
         mcp->mb[2] = ha->idc_mb[2];
         mcp->mb[3] = ha->idc_mb[3];

@@ -4372,11 +4602,11 @@
         mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
-        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_3(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -4383,36 +4613,40 @@
  * ql_idc_time_extend
  *      Inter-Driver Communication Time Extend
  *
  * Input:
  *      ha:     adapter state pointer.
- *      mr:     pointer for mailbox data.
  *
  * Returns:
  *      ql local function return status code.
  *
  * Context:
  *      Kernel context.
  */
 int
-ql_idc_time_extend(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+ql_idc_time_extend(ql_adapter_state_t *ha)
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_IDC_TIME_EXTEND;
-        mcp->mb[1] = mr->mb[1];
-        mcp->mb[2] = mr->mb[2];
-        mcp->out_mb = MBX_2|MBX_1|MBX_0;
+        mcp->mb[1] = ha->idc_mb[1];
+        mcp->mb[2] = ha->idc_mb[2];
+        mcp->mb[3] = ha->idc_mb[3];
+        mcp->mb[4] = ha->idc_mb[4];
+        mcp->mb[5] = ha->idc_mb[5];
+        mcp->mb[6] = ha->idc_mb[6];
+        mcp->mb[7] = ha->idc_mb[7];
+        mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
-        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_3(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -4433,19 +4667,19 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_PORT_RESET;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
-        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_3(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -4468,11 +4702,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_SET_PORT_CONFIG;
         mcp->mb[1] = mrp->mb[1];
         mcp->mb[2] = mrp->mb[2];
         mcp->mb[3] = mrp->mb[3];

@@ -4480,11 +4714,11 @@
         mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->in_mb = MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
-        QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+        QL_PRINT_3(ha, "done\n");
 
         return (rval);
 }
 
 /*

@@ -4507,11 +4741,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_GET_PORT_CONFIG;
         mcp->out_mb = MBX_0;
         mcp->in_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->timeout = MAILBOX_TOV;

@@ -4522,11 +4756,11 @@
                         mrp->mb[1] = mcp->mb[1];
                         mrp->mb[2] = mcp->mb[2];
                         mrp->mb[3] = mcp->mb[3];
                         mrp->mb[4] = mcp->mb[4];
                 }
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         } else {
                 EL(ha, "status=%xh, mbx1=%xh, mbx2=%xh, mbx3=%xh, mbx4=%xh\n",
                     rval, mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[4]);
         }
 

@@ -4557,36 +4791,33 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started, cmd=%xh\n", cmd);
 
         mcp->mb[0] = MBC_FLASH_ACCESS;
-        if (cmd > 0 && cmd < 4) {
-                mcp->mb[1] = (uint16_t)(FAC_FORCE_SEMA_LOCK | cmd);
-        } else {
                 mcp->mb[1] = cmd;
-        }
         mcp->mb[2] = LSW(start);
         mcp->mb[3] = MSW(start);
         mcp->mb[4] = LSW(end);
         mcp->mb[5] = MSW(end);
 
         mcp->out_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
-        mcp->in_mb = MBX_2|MBX_1|MBX_0;
+        mcp->in_mb = MBX_0_THRU_4;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 
         if (rval != QL_SUCCESS) {
-                EL(ha, "status=%xh, mbx1=%xh, mbx2=%xh\n", rval, mcp->mb[1],
-                    mcp->mb[2]);
+                EL(ha, "cmd=%xh, status=%xh, mbx1=%xh, mbx2=%xh, mbx3=%xh, "
+                    "mbx4=%xh\n", cmd, rval, mcp->mb[1], mcp->mb[2],
+                    mcp->mb[3], mcp->mb[4]);
         } else {
                 if (dp != NULL) {
                         *dp = (uint32_t)mcp->mb[1];
                 }
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -4611,11 +4842,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             (uint32_t)size)) != QL_SUCCESS) {
                 EL(ha, "setup_mbox_dma_resources failed: %xh\n", rval);
                 return (QL_MEMORY_ALLOC_FAILED);

@@ -4640,11 +4871,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "status=%xh, mbx1=%xh, mbx2=%xh\n", rval, mcp->mb[1],
                     mcp->mb[2]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -4669,11 +4900,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc, size)) !=
             QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", QL_MEMORY_ALLOC_FAILED);
                 return (QL_MEMORY_ALLOC_FAILED);

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

@@ -4729,11 +4960,11 @@
         int             rval;
         dma_mem_t       mem_desc;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         if ((rval = ql_setup_mbox_dma_resources(ha, &mem_desc,
             fcf_list->buffer_size)) !=
             QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", QL_MEMORY_ALLOC_FAILED);

@@ -4763,11 +4994,11 @@
         if (rval != QL_SUCCESS) {
                 EL(ha, "status=%xh, mbx1=%xh, mbx2=%xh\n", rval, mcp->mb[1],
                     mcp->mb[2]);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
         return (rval);
 }
 

@@ -4791,14 +5022,14 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
-        mcp->out_mb = MBX_0;
+        mcp->out_mb = MBX_9|MBX_1|MBX_0;
         mcp->in_mb = MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|
             MBX_3|MBX_2|MBX_1|MBX_0;
         mcp->timeout = MAILBOX_TOV;
         rval = ql_mailbox_command(ha, mcp);
 

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

@@ -4843,11 +5074,11 @@
 {
         int             rval;
         mbx_cmd_t       mc = {0};
         mbx_cmd_t       *mcp = &mc;
 
-        QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+        QL_PRINT_3(ha, "started\n");
 
         mcp->mb[0] = MBC_TOGGLE_INTERRUPT;
         mcp->mb[1] = opt;
         mcp->out_mb = MBX_1|MBX_0;
         mcp->in_mb = MBX_0;

@@ -4856,10 +5087,618 @@
 
         if (rval != QL_SUCCESS) {
                 EL(ha, "failed=%xh\n", rval);
         } else {
                 /*EMPTY*/
-                QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+                QL_PRINT_3(ha, "done\n");
         }
 
+        return (rval);
+}
+
+/*
+ * ql_get_md_template
+ *      Issue request mini-dump template Mailbox command
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mem:    pointer to dma memory object for command.
+ *      mr:     pointer for return mailboxes.
+ *      ofst:   template offset.
+ *      opt:    request command code.
+ *              GTO_TEMPLATE_SIZE       = Request Template Size.
+ *              GTO_TEMPLATE            = Request Template.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_get_md_template(ql_adapter_state_t *ha, dma_mem_t *mem, ql_mbx_data_t *mr,
+    uint32_t ofst, uint16_t opt)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_GET_MD_TEMPLATE;
+        mcp->mb[2] = opt;
+        if (mem != NULL) {
+                mcp->mb[4] = LSW(mem->cookies->dmac_address);
+                mcp->mb[5] = MSW(mem->cookies->dmac_address);
+                mcp->mb[6] = LSW(mem->cookies->dmac_notused);
+                mcp->mb[7] = MSW(mem->cookies->dmac_notused);
+                mcp->mb[8] = LSW(mem->size);
+                mcp->mb[9] = MSW(mem->size);
+        }
+        if (ofst != 0) {
+                mcp->mb[10] = LSW(ofst);
+                mcp->mb[11] = MSW(ofst);
+        }
+        mcp->out_mb = MBX_11|MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|
+            MBX_2|MBX_1|MBX_0;
+        mcp->in_mb = MBX_15|MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|
+            MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        /* Return mailbox data. */
+        if (mr != NULL) {
+                mr->mb[0] = mcp->mb[0];
+                mr->mb[1] = mcp->mb[1];
+                mr->mb[2] = mcp->mb[2];
+                mr->mb[3] = mcp->mb[3];
+                mr->mb[4] = mcp->mb[4];
+                mr->mb[5] = mcp->mb[5];
+                mr->mb[6] = mcp->mb[6];
+                mr->mb[7] = mcp->mb[7];
+                mr->mb[8] = mcp->mb[8];
+                mr->mb[9] = mcp->mb[9];
+                mr->mb[10] = mcp->mb[10];
+                mr->mb[11] = mcp->mb[11];
+                mr->mb[12] = mcp->mb[12];
+                mr->mb[13] = mcp->mb[13];
+                mr->mb[12] = mcp->mb[14];
+                mr->mb[13] = mcp->mb[15];
+        }
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed=%xh\n", rval);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_init_req_q
+ *       Initialize request queue.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      req_q:  request queue structure pointer.
+ *      opt:    Initialize Multiple Queue mailbox command options.
+ *
+ * Returns:
+ *      ql driver local function return status codes
+ *
+ * Context:
+ *      Kernel context.
+ */
+static int
+ql_init_req_q(ql_adapter_state_t *ha, ql_request_q_t *req_q, uint16_t opt)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started, req_q_number=%d\n", req_q->req_q_number);
+
+        if (!(opt & IMO_QOS_UPDATE)) {
+                req_q->req_ring_ptr = req_q->req_ring.bp;
+                req_q->req_ring_index = 0;
+                req_q->req_q_cnt = (uint16_t)(req_q->req_entry_cnt - 1);
+                WR32_MBAR_REG(ha, req_q->mbar_req_in, 0);
+                if (req_q->req_out_shadow_ptr) {
+                        *req_q->req_out_shadow_ptr = 0;
+                }
+        }
+
+        mcp->mb[0] = MBC_INIT_MULTIPLE_QUEUE;
+        mcp->mb[1] = (uint16_t)(opt | IMO_QUEUE_NOT_ASSOCIATED);
+        mcp->mb[2] = MSW(LSD(req_q->req_ring.cookie.dmac_laddress));
+        mcp->mb[3] = LSW(LSD(req_q->req_ring.cookie.dmac_laddress));
+        mcp->mb[4] = req_q->req_q_number;
+        mcp->mb[5] = req_q->req_entry_cnt;
+        mcp->mb[6] = MSW(MSD(req_q->req_ring.cookie.dmac_laddress));
+        mcp->mb[7] = LSW(MSD(req_q->req_ring.cookie.dmac_laddress));
+        mcp->mb[11] = ha->vp_index;
+        mcp->mb[12] = 0;
+        mcp->mb[14] = 1;
+        mcp->out_mb = MBX_0_THRU_14;
+        mcp->in_mb = MBX_0_THRU_1;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "status=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_init_rsp_q
+ *       Initialize response queue.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      rsp_q:  response queue structure pointer.
+ *      opt:    Initialize Multiple Queue mailbox command options.
+ *
+ * Returns:
+ *      ql driver local function return status codes
+ *
+ * Context:
+ *      Kernel context.
+ */
+static int
+ql_init_rsp_q(ql_adapter_state_t *ha, ql_response_q_t *rsp_q, uint16_t opt)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started, rsp_q_number=%d\n", rsp_q->rsp_q_number);
+
+        if (!(opt & IMO_DELETE_Q)) {
+                rsp_q->rsp_ring_ptr = rsp_q->rsp_ring.bp;
+                rsp_q->rsp_ring_index = 0;
+                WR32_MBAR_REG(ha, rsp_q->mbar_rsp_out, 0);
+                if (rsp_q->rsp_in_shadow_ptr) {
+                        *rsp_q->rsp_in_shadow_ptr = 0;
+                }
+        }
+
+        mcp->mb[0] = MBC_INIT_MULTIPLE_QUEUE;
+        mcp->mb[1] = (uint16_t)(opt | IMO_QUEUE_NOT_ASSOCIATED |
+            IMO_RESPONSE_Q_SERVICE);
+        mcp->mb[2] = MSW(LSD(rsp_q->rsp_ring.cookie.dmac_laddress));
+        mcp->mb[3] = LSW(LSD(rsp_q->rsp_ring.cookie.dmac_laddress));
+        mcp->mb[4] = rsp_q->rsp_q_number;
+        mcp->mb[5] = rsp_q->rsp_entry_cnt;
+        mcp->mb[6] = MSW(MSD(rsp_q->rsp_ring.cookie.dmac_laddress));
+        mcp->mb[7] = LSW(MSD(rsp_q->rsp_ring.cookie.dmac_laddress));
+        mcp->mb[14] = rsp_q->msi_x_vector;
+        mcp->out_mb = MBX_0_THRU_14;
+        mcp->in_mb = MBX_0_THRU_1;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "status=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_load_flash_image
+ *      Load Flash Firmware.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_load_flash_image(ql_adapter_state_t *ha)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_LOAD_FLASH_IMAGE;
+        mcp->out_mb = MBX_0;
+        mcp->in_mb = MBX_2|MBX_1|MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, rval=%xh, mbx1=%xh, mbx2=%xh\n",
+                    rval, mcp->mb[1], mcp->mb[2]);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_set_led_config
+ *      Set LED Configuration.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mr:     pointer for mailbox data.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_set_led_config(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_SET_LED_CONFIG;
+        mcp->mb[1] = mr->mb[1];
+        mcp->mb[2] = mr->mb[2];
+        mcp->mb[3] = mr->mb[3];
+        mcp->mb[4] = mr->mb[4];
+        mcp->mb[5] = mr->mb[5];
+        mcp->mb[6] = mr->mb[6];
+        mcp->out_mb = MBX_0_THRU_6;
+        mcp->in_mb = MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed=%xh\n", rval);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+
+        return (rval);
+}
+/*
+ * ql_get_led_config
+ *      Get LED Configuration.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mr:     pointer for mailbox data.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_get_led_config(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_GET_LED_CONFIG;
+        mcp->out_mb = MBX_0;
+        mcp->in_mb = MBX_0_THRU_6;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        /* Return config data. */
+        if (mr != NULL) {
+                mr->mb[1] = mcp->mb[1];
+                mr->mb[2] = mcp->mb[2];
+                mr->mb[3] = mcp->mb[3];
+                mr->mb[4] = mcp->mb[4];
+                mr->mb[5] = mcp->mb[5];
+                mr->mb[6] = mcp->mb[6];
+        }
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed=%xh\n", rval);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+
+        return (rval);
+}
+
+/*
+ * ql_led_config
+ *      Set/Get Fibre Channel LED Configuration command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      opt:    Options.
+ *      led0:   LED 0 configuration.
+ *      led1:   LED 1 configuration.
+ *      led2:   LED 2 configuration.
+ *      mr:     pointer for mailbox data.
+ *
+ * Returns:
+ *      qlc local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_led_config(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+{
+        int                     rval = QL_SUCCESS;
+        mbx_cmd_t               mc = {0};
+        mbx_cmd_t               *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_FC_LED_CONFIG;
+        mcp->mb[1] = mr->mb[1];
+        mcp->mb[2] = mr->mb[2];
+        mcp->mb[3] = mr->mb[3];
+        mcp->mb[4] = mr->mb[4];
+        mcp->out_mb = MBX_0_THRU_4;
+        mcp->in_mb = MBX_0_THRU_4;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        /* Return mailbox data. */
+        mr->mb[0] = mcp->mb[0];
+        mr->mb[1] = mcp->mb[1];
+        mr->mb[2] = mcp->mb[2];
+        mr->mb[3] = mcp->mb[3];
+        mr->mb[4] = mcp->mb[4];
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, rval=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_write_remote_reg
+ *      Writes a register within another function.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      addr:   address.
+ *      data:   data.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_write_remote_reg(ql_adapter_state_t *ha, uint32_t addr, uint32_t data)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_10(ha, "started, addr=%xh, data=%xh\n", addr, data);
+
+        mcp->mb[0] = MBC_WRITE_REMOTE_REG;
+        mcp->mb[1] = LSW(addr);
+        mcp->mb[2] = MSW(addr);
+        mcp->mb[3] = LSW(data);
+        mcp->mb[4] = MSW(data);
+        mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+        mcp->in_mb = MBX_1|MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed=%xh, mbx1=%xh, addr=%xh, data=%xh\n", rval,
+                    mcp->mb[1], addr, data);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_10(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_read_remote_reg
+ *      Read a register within another function.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      addr:   address.
+ *      data:   data pointer.
+ *
+ * Returns:
+ *      qlc local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_read_remote_reg(ql_adapter_state_t *ha, uint32_t addr, uint32_t *dp)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_10(ha, "started, addr=%xh\n", addr);
+
+        mcp->mb[0] = MBC_READ_REMOTE_REG;
+        mcp->mb[1] = LSW(addr);
+        mcp->mb[2] = MSW(addr);
+        mcp->out_mb = MBX_2|MBX_1|MBX_0;
+        mcp->in_mb = MBX_4|MBX_3|MBX_1|MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed=%xh, mbx1=%xh, addr=%xh\n", rval, mcp->mb[1],
+                    addr);
+        } else {
+                *dp = SHORT_TO_LONG(mcp->mb[3], mcp->mb[4]);
+                QL_PRINT_10(ha, "done, addr=%xh, data=%xh\n", addr, *dp);
+        }
+        return (rval);
+}
+
+/*
+ * ql_get_temp
+ *      Issue get temperature mailbox command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mr:     pointer for mailbox data.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_get_temp(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_GET_PARAMETERS;
+        mcp->mb[1] = READ_ASIC_TEMP << 8;
+        mcp->out_mb = MBX_0_THRU_1;
+        mcp->in_mb = MBX_0_THRU_1;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        /* Return config data. */
+        if (mr != NULL) {
+                mr->mb[1] = mcp->mb[1];
+        }
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, rval=%xh, mbx1=%xh\n", rval, mcp->mb[1]);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+        return (rval);
+}
+
+/*
+ * ql_write_serdes
+ *      Issue write FC serdes register mailbox command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mr:     pointer for mailbox data.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_write_serdes(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_WRITE_SERDES_REG;
+        mcp->mb[1] = mr->mb[1];
+        mcp->mb[2] = mr->mb[2];
+        mcp->mb[3] = mr->mb[3];
+        mcp->mb[4] = mr->mb[4];
+        mcp->mb[5] = mr->mb[5];
+        mcp->mb[6] = mr->mb[6];
+        mcp->out_mb = MBX_0_THRU_6;
+        mcp->in_mb = MBX_0;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, rval=%xh\n", rval);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+
+        return (rval);
+}
+
+/*
+ * ql_read_serdes
+ *      Issue read FC serdes register mailbox command.
+ *
+ * Input:
+ *      ha:     adapter state pointer.
+ *      mr:     pointer for mailbox data.
+ *
+ * Returns:
+ *      ql local function return status code.
+ *
+ * Context:
+ *      Kernel context.
+ */
+int
+ql_read_serdes(ql_adapter_state_t *ha, ql_mbx_data_t *mr)
+{
+        int             rval;
+        mbx_cmd_t       mc = {0};
+        mbx_cmd_t       *mcp = &mc;
+
+        QL_PRINT_3(ha, "started\n");
+
+        mcp->mb[0] = MBC_READ_SERDES_REG;
+        mcp->mb[1] = mr->mb[1];
+        mcp->mb[2] = mr->mb[2];
+        mcp->mb[3] = mr->mb[3];
+        mcp->mb[4] = mr->mb[4];
+        mcp->mb[5] = mr->mb[5];
+        mcp->mb[6] = mr->mb[6];
+        mcp->out_mb = MBX_0_THRU_6;
+        mcp->in_mb = MBX_0_THRU_6;
+        mcp->timeout = MAILBOX_TOV;
+        rval = ql_mailbox_command(ha, mcp);
+
+        /* Return mailbox data. */
+        mr->mb[0] = mcp->mb[0];
+        mr->mb[1] = mcp->mb[1];
+        mr->mb[2] = mcp->mb[2];
+        mr->mb[3] = mcp->mb[3];
+        mr->mb[4] = mcp->mb[4];
+        mr->mb[4] = mcp->mb[5];
+        mr->mb[4] = mcp->mb[6];
+
+        if (rval != QL_SUCCESS) {
+                EL(ha, "failed, rval=%xh", rval);
+        } else {
+                /*EMPTY*/
+                QL_PRINT_3(ha, "done\n");
+        }
+
         return (rval);
 }