int aac_check_reset = 1;
 module_param_named(check_reset, aac_check_reset, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(aac_check_reset, "If adapter fails health check, reset the adapter.");
+MODULE_PARM_DESC(aac_check_reset, "If adapter fails health check, reset the adapter. a value of -1 forces the reset to adapters programmed to ignore it.");
 
 int expose_physicals = -1;
 module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
                          (int)sizeof(dev->supplement_adapter_info.VpdInfo.Tsid),
                          dev->supplement_adapter_info.VpdInfo.Tsid);
                }
-               if (!aac_check_reset ||
+               if (!aac_check_reset || ((aac_check_reset != 1) &&
                  (dev->supplement_adapter_info.SupportedOptions2 &
-                 le32_to_cpu(AAC_OPTION_IGNORE_RESET))) {
+                 le32_to_cpu(AAC_OPTION_IGNORE_RESET)))) {
                        printk(KERN_INFO "%s%d: Reset Adapter Ignored\n",
                          dev->name, dev->id);
                }
        if (active)
                return SCSI_MLQUEUE_DEVICE_BUSY;
 
-       aac = (struct aac_dev *)scsicmd->device->host->hostdata;
+       aac = (struct aac_dev *)sdev->host->hostdata;
        if (aac->in_reset)
                return SCSI_MLQUEUE_HOST_BUSY;
 
 
        }
 
        /* Quiesce build, flush cache, write through mode */
-       aac_send_shutdown(aac);
+       if (forced < 2)
+               aac_send_shutdown(aac);
        spin_lock_irqsave(host->host_lock, flagv);
-       retval = _aac_reset_adapter(aac, forced);
+       retval = _aac_reset_adapter(aac, forced ? forced : ((aac_check_reset != 0) && (aac_check_reset != 1)));
        spin_unlock_irqrestore(host->host_lock, flagv);
 
-       if (retval == -ENODEV) {
+       if ((forced < 2) && (retval == -ENODEV)) {
                /* Unwind aac_send_shutdown() IOP_RESET unsupported/disabled */
                struct fib * fibctx = aac_fib_alloc(aac);
                if (fibctx) {
 
        printk(KERN_ERR "%s: Host adapter BLINK LED 0x%x\n", aac->name, BlinkLED);
 
-       if (!aac_check_reset ||
+       if (!aac_check_reset || ((aac_check_reset != 1) &&
                (aac->supplement_adapter_info.SupportedOptions2 &
-                       le32_to_cpu(AAC_OPTION_IGNORE_RESET)))
+                       le32_to_cpu(AAC_OPTION_IGNORE_RESET))))
                goto out;
        host = aac->scsi_host_ptr;
        if (aac->thread->pid != current->pid)
                spin_lock_irqsave(host->host_lock, flagv);
-       BlinkLED = _aac_reset_adapter(aac, 0);
+       BlinkLED = _aac_reset_adapter(aac, aac_check_reset != 1);
        if (aac->thread->pid != current->pid)
                spin_unlock_irqrestore(host->host_lock, flagv);
        return BlinkLED;
 
         * support a register, instead of a commanded, reset.
         */
        if ((aac->supplement_adapter_info.SupportedOptions2 &
-         le32_to_cpu(AAC_OPTION_MU_RESET|AAC_OPTION_IGNORE_RESET)) ==
-         le32_to_cpu(AAC_OPTION_MU_RESET))
+          le32_to_cpu(AAC_OPTION_MU_RESET)) &&
+         aac_check_reset &&
+         ((aac_check_reset != 1) ||
+          (aac->supplement_adapter_info.SupportedOptions2 &
+           le32_to_cpu(AAC_OPTION_IGNORE_RESET))))
                aac_reset_adapter(aac, 2); /* Bypass wait for command quiesce */
        return SUCCESS; /* Cause an immediate retry of the command with a ten second delay after successful tur */
 }
 
        dev->OIMR = status = rx_readb (dev, MUnit.OIMR);
        if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) &&
          !aac_rx_restart_adapter(dev, 0))
-               ++restart;
+               /* Make sure the Hardware FIFO is empty */
+               while ((++restart < 512) &&
+                 (rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL));
        /*
         *      Check to see if the board panic'd while booting.
         */