void (*lpfc_stop_port)
                (struct lpfc_hba *);
        int (*lpfc_hba_init_link)
-               (struct lpfc_hba *);
+               (struct lpfc_hba *, uint32_t);
        int (*lpfc_hba_down_link)
-               (struct lpfc_hba *);
+               (struct lpfc_hba *, uint32_t);
 
        /* SLI4 specific HBA data structure */
        struct lpfc_sli4_hba sli4_hba;
 #define LPFC_SLI3_NPIV_ENABLED         0x02
 #define LPFC_SLI3_VPORT_TEARDOWN       0x04
 #define LPFC_SLI3_CRP_ENABLED          0x08
-#define LPFC_SLI3_INB_ENABLED          0x10
 #define LPFC_SLI3_BG_ENABLED           0x20
 #define LPFC_SLI3_DSS_ENABLED          0x40
        uint32_t iocb_cmd_size;
 
        MAILBOX_t *mbox;
        uint32_t *mbox_ext;
-       uint32_t *inb_ha_copy;
-       uint32_t *inb_counter;
-       uint32_t inb_last_counter;
        uint32_t ha_copy;
        struct _PCB *pcb;
        struct _IOCB *IOCBs;
 
 /**
  * lpfc_hba_init_link - Initialize the FC link
  * @phba: pointer to lpfc hba data structure.
+ * @flag: mailbox command issue mode - either MBX_POLL or MBX_NOWAIT
  *
  * This routine will issue the INIT_LINK mailbox command call.
  * It is available to other drivers through the lpfc_hba data
  *             Any other value - error
  **/
 int
-lpfc_hba_init_link(struct lpfc_hba *phba)
+lpfc_hba_init_link(struct lpfc_hba *phba, uint32_t flag)
 {
        struct lpfc_vport *vport = phba->pport;
        LPFC_MBOXQ_t *pmb;
                phba->cfg_link_speed);
        pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
        lpfc_set_loopback_flag(phba);
-       rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
+       rc = lpfc_sli_issue_mbox(phba, pmb, flag);
        if (rc != MBX_SUCCESS) {
                lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                        "0498 Adapter failed to init, mbxCmd x%x "
                writel(0xffffffff, phba->HAregaddr);
                readl(phba->HAregaddr); /* flush */
                phba->link_state = LPFC_HBA_ERROR;
-               if (rc != MBX_BUSY)
+               if (rc != MBX_BUSY || flag == MBX_POLL)
                        mempool_free(pmb, phba->mbox_mem_pool);
                return -EIO;
        }
        phba->cfg_suppress_link_up = LPFC_INITIALIZE_LINK;
+       if (flag == MBX_POLL)
+               mempool_free(pmb, phba->mbox_mem_pool);
 
        return 0;
 }
 
 /**
  * lpfc_hba_down_link - this routine downs the FC link
+ * @phba: pointer to lpfc hba data structure.
+ * @flag: mailbox command issue mode - either MBX_POLL or MBX_NOWAIT
  *
  * This routine will issue the DOWN_LINK mailbox command call.
  * It is available to other drivers through the lpfc_hba data
  *             Any other value - error
  **/
 int
-lpfc_hba_down_link(struct lpfc_hba *phba)
+lpfc_hba_down_link(struct lpfc_hba *phba, uint32_t flag)
 {
        LPFC_MBOXQ_t *pmb;
        int rc;
                "0491 Adapter Link is disabled.\n");
        lpfc_down_link(phba, pmb);
        pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
-       rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
+       rc = lpfc_sli_issue_mbox(phba, pmb, flag);
        if ((rc != MBX_SUCCESS) && (rc != MBX_BUSY)) {
                lpfc_printf_log(phba,
                KERN_ERR, LOG_INIT,
                mempool_free(pmb, phba->mbox_mem_pool);
                return -EIO;
        }
+       if (flag == MBX_POLL)
+               mempool_free(pmb, phba->mbox_mem_pool);
+
        return 0;
 }
 
 lpfc_block_mgmt_io(struct lpfc_hba * phba)
 {
        unsigned long iflag;
+       uint8_t actcmd = MBX_HEARTBEAT;
+       unsigned long timeout;
+
 
        spin_lock_irqsave(&phba->hbalock, iflag);
        phba->sli.sli_flag |= LPFC_BLOCK_MGMT_IO;
+       if (phba->sli.mbox_active)
+               actcmd = phba->sli.mbox_active->u.mb.mbxCommand;
        spin_unlock_irqrestore(&phba->hbalock, iflag);
+       /* Determine how long we might wait for the active mailbox
+        * command to be gracefully completed by firmware.
+        */
+       timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, actcmd) * 1000) +
+                       jiffies;
+       /* Wait for the outstnading mailbox command to complete */
+       while (phba->sli.mbox_active) {
+               /* Check active mailbox complete status every 2ms */
+               msleep(2);
+               if (time_after(jiffies, timeout)) {
+                       lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
+                               "2813 Mgmt IO is Blocked %x "
+                               "- mbox cmd %x still active\n",
+                               phba->sli.sli_flag, actcmd);
+                       break;
+               }
+       }
 }
 
 /**
 
 
                        phba->link_state = LPFC_HBA_ERROR;
                        mempool_free(pmb, phba->mbox_mem_pool);
-                       return ENXIO;
+                       return -ENXIO;
                }
        }
        phba->hbq_count = hbq_count;
                phba->sli3_options &= ~(LPFC_SLI3_NPIV_ENABLED |
                                        LPFC_SLI3_HBQ_ENABLED |
                                        LPFC_SLI3_CRP_ENABLED |
-                                       LPFC_SLI3_INB_ENABLED |
                                        LPFC_SLI3_BG_ENABLED);
                if (rc != MBX_SUCCESS) {
                        lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                        phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED;
                if (pmb->u.mb.un.varCfgPort.gcrp)
                        phba->sli3_options |= LPFC_SLI3_CRP_ENABLED;
-               if (pmb->u.mb.un.varCfgPort.ginb) {
-                       phba->sli3_options |= LPFC_SLI3_INB_ENABLED;
-                       phba->hbq_get = phba->mbox->us.s3_inb_pgp.hbq_get;
-                       phba->port_gp = phba->mbox->us.s3_inb_pgp.port;
-                       phba->inb_ha_copy = &phba->mbox->us.s3_inb_pgp.ha_copy;
-                       phba->inb_counter = &phba->mbox->us.s3_inb_pgp.counter;
-                       phba->inb_last_counter =
-                                       phba->mbox->us.s3_inb_pgp.counter;
-               } else {
-                       phba->hbq_get = phba->mbox->us.s3_pgp.hbq_get;
-                       phba->port_gp = phba->mbox->us.s3_pgp.port;
-                       phba->inb_ha_copy = NULL;
-                       phba->inb_counter = NULL;
-               }
+
+               phba->hbq_get = phba->mbox->us.s3_pgp.hbq_get;
+               phba->port_gp = phba->mbox->us.s3_pgp.port;
 
                if (phba->cfg_enable_bg) {
                        if (pmb->u.mb.un.varCfgPort.gbg)
        } else {
                phba->hbq_get = NULL;
                phba->port_gp = phba->mbox->us.s2.port;
-               phba->inb_ha_copy = NULL;
-               phba->inb_counter = NULL;
                phba->max_vpi = 0;
        }
 do_prep_failed: