extern int qla25xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
                                    uint32_t);
 extern int qla2x00_is_a_vp_did(scsi_qla_host_t *, uint32_t);
-bool qla2x00_check_reg_for_disconnect(scsi_qla_host_t *, uint32_t);
+bool qla2x00_check_reg32_for_disconnect(scsi_qla_host_t *, uint32_t);
+bool qla2x00_check_reg16_for_disconnect(scsi_qla_host_t *, uint16_t);
 
 extern int qla2x00_beacon_on(struct scsi_qla_host *);
 extern int qla2x00_beacon_off(struct scsi_qla_host *);
 
        vha = pci_get_drvdata(ha->pdev);
        for (iter = 50; iter--; ) {
                hccr = RD_REG_WORD(®->hccr);
-               /* Check for PCI disconnection */
-               if (hccr == 0xffff) {
-                       /*
-                        * Schedule this on the default system workqueue so that
-                        * all the adapter workqueues and the DPC thread can be
-                        * shutdown cleanly.
-                        */
-                       schedule_work(&ha->board_disable);
+               if (qla2x00_check_reg16_for_disconnect(vha, hccr))
                        break;
-               }
                if (hccr & HCCR_RISC_PAUSE) {
                        if (pci_channel_offline(ha->pdev))
                                break;
 }
 
 bool
-qla2x00_check_reg_for_disconnect(scsi_qla_host_t *vha, uint32_t reg)
+qla2x00_check_reg32_for_disconnect(scsi_qla_host_t *vha, uint32_t reg)
 {
        /* Check for PCI disconnection */
        if (reg == 0xffffffff) {
                return false;
 }
 
+bool
+qla2x00_check_reg16_for_disconnect(scsi_qla_host_t *vha, uint16_t reg)
+{
+       return qla2x00_check_reg32_for_disconnect(vha, 0xffff0000 | reg);
+}
+
 /**
  * qla2300_intr_handler() - Process interrupts for the ISP23xx and ISP63xx.
  * @irq:
        vha = pci_get_drvdata(ha->pdev);
        for (iter = 50; iter--; ) {
                stat = RD_REG_DWORD(®->u.isp2300.host_status);
-               if (qla2x00_check_reg_for_disconnect(vha, stat))
+               if (qla2x00_check_reg32_for_disconnect(vha, stat))
                        break;
                if (stat & HSR_RISC_PAUSED) {
                        if (unlikely(pci_channel_offline(ha->pdev)))
        vha = pci_get_drvdata(ha->pdev);
        for (iter = 50; iter--; ) {
                stat = RD_REG_DWORD(®->host_status);
-               if (qla2x00_check_reg_for_disconnect(vha, stat))
+               if (qla2x00_check_reg32_for_disconnect(vha, stat))
                        break;
                if (stat & HSRX_RISC_PAUSED) {
                        if (unlikely(pci_channel_offline(ha->pdev)))
         * we process the response queue.
         */
        stat = RD_REG_DWORD(®->host_status);
-       if (qla2x00_check_reg_for_disconnect(vha, stat))
+       if (qla2x00_check_reg32_for_disconnect(vha, stat))
                goto out;
        qla24xx_process_response_queue(vha, rsp);
        if (!ha->flags.disable_msix_handshake) {
                hccr = RD_REG_DWORD_RELAXED(®->hccr);
                spin_unlock_irqrestore(&ha->hardware_lock, flags);
        }
-       if (qla2x00_check_reg_for_disconnect(vha, hccr))
+       if (qla2x00_check_reg32_for_disconnect(vha, hccr))
                goto out;
        queue_work_on((int) (rsp->id - 1), ha->wq, &rsp->q_work);
 
        vha = pci_get_drvdata(ha->pdev);
        do {
                stat = RD_REG_DWORD(®->host_status);
-               if (qla2x00_check_reg_for_disconnect(vha, stat))
+               if (qla2x00_check_reg32_for_disconnect(vha, stat))
                        break;
                if (stat & HSRX_RISC_PAUSED) {
                        if (unlikely(pci_channel_offline(ha->pdev)))
 
        vha = pci_get_drvdata(ha->pdev);
        do {
                host_int = RD_REG_DWORD(®->host_int);
-               if (qla2x00_check_reg_for_disconnect(vha, host_int))
+               if (qla2x00_check_reg32_for_disconnect(vha, host_int))
                        break;
                if (host_int) {
                        stat = RD_REG_DWORD(®->host_status);
        spin_lock_irqsave(&ha->hardware_lock, flags);
        vha = pci_get_drvdata(ha->pdev);
        host_int = RD_REG_DWORD(®->host_int);
-       if (qla2x00_check_reg_for_disconnect(vha, host_int))
+       if (qla2x00_check_reg32_for_disconnect(vha, host_int))
                goto out;
        qla24xx_process_response_queue(vha, rsp);
        WRT_REG_DWORD(®->host_int, 0);
        vha = pci_get_drvdata(ha->pdev);
 
        host_int = RD_REG_DWORD(®->host_int);
-       if (qla2x00_check_reg_for_disconnect(vha, host_int))
+       if (qla2x00_check_reg32_for_disconnect(vha, host_int))
                goto out;
        if (host_int) {
                stat = RD_REG_DWORD(®->host_status);