VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / scsi / qla2xxx / qla_os.c
index cf3b812..dd5aaba 100644 (file)
  * General Public License for more details.
  *
  */
-
-#include "qla_os.h"
 #include "qla_def.h"
 
+#include <linux/moduleparam.h>
+#include <linux/vmalloc.h>
+#include <linux/smp_lock.h>
+
+#include <scsi/scsi_tcq.h>
+#include <scsi/scsicam.h>
+#include <scsi/scsi_transport.h>
+#include <scsi/scsi_transport_fc.h>
+
 /*
  * Driver version
  */
@@ -46,72 +53,79 @@ int apiHBAInstance;
  * Module parameter information and variables
  */
 int ql2xmaxqdepth;
-module_param(ql2xmaxqdepth, int, 0);
+module_param(ql2xmaxqdepth, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ql2xmaxqdepth,
                "Maximum queue depth to report for target devices.");
 
 int ql2xlogintimeout = 20;
-module_param(ql2xlogintimeout, int, 0);
+module_param(ql2xlogintimeout, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(ql2xlogintimeout,
                "Login timeout value in seconds.");
 
 int qlport_down_retry;
-module_param(qlport_down_retry, int, 0);
+module_param(qlport_down_retry, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(qlport_down_retry,
                "Maximum number of command retries to a port that returns"
                "a PORT-DOWN status.");
 
 int ql2xretrycount = 20;
-module_param(ql2xretrycount, int, 0);
+module_param(ql2xretrycount, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ql2xretrycount,
                "Maximum number of mid-layer retries allowed for a command.  "
                "Default value is 20, ");
 
 int displayConfig;
-module_param(displayConfig, int, 0);
+module_param(displayConfig, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(displayConfig,
                "If 1 then display the configuration used in /etc/modprobe.conf.");
 
 int ql2xplogiabsentdevice;
-module_param(ql2xplogiabsentdevice, int, 0);
+module_param(ql2xplogiabsentdevice, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ql2xplogiabsentdevice,
                "Option to enable PLOGI to devices that are not present after "
                "a Fabric scan.  This is needed for several broken switches."
                "Default is 0 - no PLOGI. 1 - perfom PLOGI.");
 
+int ql2xenablezio = 0;
+module_param(ql2xenablezio, int, S_IRUGO|S_IRUSR);
+MODULE_PARM_DESC(ql2xenablezio,
+               "Option to enable ZIO:If 1 then enable it otherwise" 
+               " use the default set in the NVRAM."
+               " Default is 0 : disabled");
+
 int ql2xintrdelaytimer = 10;
-module_param(ql2xintrdelaytimer, int, 0);
+module_param(ql2xintrdelaytimer, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(ql2xintrdelaytimer,
                "ZIO: Waiting time for Firmware before it generates an "
                "interrupt to the host to notify completion of request.");
 
 int ConfigRequired;
-module_param(ConfigRequired, int, 0);
+module_param(ConfigRequired, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(ConfigRequired,
                "If 1, then only configured devices passed in through the"
                "ql2xopts parameter will be presented to the OS");
 
 int Bind = BIND_BY_PORT_NAME;
-module_param(Bind, int, 0);
+module_param(Bind, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(Bind,
                "Target persistent binding method: "
                "0 by Portname (default); 1 by PortID; 2 by Nodename. ");
 
 int ql2xsuspendcount = SUSPEND_COUNT;
-module_param(ql2xsuspendcount, int, 0);
+module_param(ql2xsuspendcount, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ql2xsuspendcount,
                "Number of 6-second suspend iterations to perform while a "
                "target returns a <NOT READY> status.  Default is 10 "
                "iterations.");
 
 int ql2xdoinitscan = 1;
-module_param(ql2xdoinitscan, int, 0);
+module_param(ql2xdoinitscan, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(ql2xdoinitscan,
                "Signal mid-layer to perform scan after driver load: 0 -- no "
                "signal sent to mid-layer.");
 
 int ql2xloginretrycount = 0;
-module_param(ql2xloginretrycount, int, 0);
+module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR);
 MODULE_PARM_DESC(ql2xloginretrycount,
                "Specify an alternate value for the NVRAM login retry count.");
 
@@ -128,13 +142,6 @@ struct info_str {
 static void copy_mem_info(struct info_str *, char *, int);
 static int copy_info(struct info_str *, char *, ...);
 
-
-/*
- * List of host adapters
- */
-LIST_HEAD(qla_hostlist);
-rwlock_t qla_hostlist_lock = RW_LOCK_UNLOCKED;
-
 static void qla2x00_free_device(scsi_qla_host_t *);
 
 static void qla2x00_config_dma_addressing(scsi_qla_host_t *ha);
@@ -147,7 +154,7 @@ static int qla2xxx_eh_abort(struct scsi_cmnd *);
 static int qla2xxx_eh_device_reset(struct scsi_cmnd *);
 static int qla2xxx_eh_bus_reset(struct scsi_cmnd *);
 static int qla2xxx_eh_host_reset(struct scsi_cmnd *);
-static uint8_t qla2x00_loop_reset(scsi_qla_host_t *ha);
+static int qla2x00_loop_reset(scsi_qla_host_t *ha);
 static int qla2x00_device_reset(scsi_qla_host_t *, fc_port_t *);
 
 static int qla2x00_proc_info(struct Scsi_Host *, char *, char **,
@@ -183,8 +190,6 @@ static struct scsi_transport_template *qla2xxx_transport_template = NULL;
 
 static void qla2x00_display_fc_names(scsi_qla_host_t *);
 
-void qla2x00_blink_led(scsi_qla_host_t *);
-
 /* TODO Convert to inlines
  *
  * Timer routines
@@ -457,6 +462,7 @@ static ssize_t qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf,
        struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
            struct device, kobj)));
        int reading;
+       uint32_t dump_size;
 
        if (off != 0)
                return (0);
@@ -482,11 +488,16 @@ static ssize_t qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf,
                if (ha->fw_dump != NULL && !ha->fw_dump_reading) {
                        ha->fw_dump_reading = 1;
 
-                       ha->fw_dump_buffer = (char *)vmalloc(FW_DUMP_SIZE);
+                       dump_size = FW_DUMP_SIZE_1M;
+                       if (ha->fw_memory_size < 0x20000) 
+                               dump_size = FW_DUMP_SIZE_128K;
+                       else if (ha->fw_memory_size < 0x80000) 
+                               dump_size = FW_DUMP_SIZE_512K;
+                       ha->fw_dump_buffer = (char *)vmalloc(dump_size);
                        if (ha->fw_dump_buffer == NULL) {
                                qla_printk(KERN_WARNING, ha,
                                    "Unable to allocate memory for firmware "
-                                   "dump buffer (%d).\n", FW_DUMP_SIZE);
+                                   "dump buffer (%d).\n", dump_size);
 
                                ha->fw_dump_reading = 0;
                                return (count);
@@ -494,7 +505,7 @@ static ssize_t qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf,
                        qla_printk(KERN_INFO, ha,
                            "Firmware dump ready for read on (%ld).\n",
                            ha->host_no);
-                       memset(ha->fw_dump_buffer, 0, FW_DUMP_SIZE);
+                       memset(ha->fw_dump_buffer, 0, dump_size);
                        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                                qla2100_ascii_fw_dump(ha);
                        else
@@ -878,39 +889,38 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*fn)(struct scsi_cmnd *))
 static int
 qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, struct scsi_cmnd *cmd)
 {
-#define ABORT_WAIT_TIME        10 /* seconds */
+#define ABORT_POLLING_PERIOD   HZ
+#define ABORT_WAIT_TIME                ((10 * HZ) / (ABORT_POLLING_PERIOD))
 
        int             found = 0;
        int             done = 0;
-       srb_t           *rp;
+       srb_t           *rp = NULL;
        struct list_head *list, *temp;
-       u_long          cpu_flags = 0;
        u_long          max_wait_time = ABORT_WAIT_TIME;
 
        do {
                /* Check on done queue */
-               if (!found) {
-                       spin_lock_irqsave(&ha->list_lock, cpu_flags);
-                       list_for_each_safe(list, temp, &ha->done_queue) {
-                               rp = list_entry(list, srb_t, list);
+               spin_lock(&ha->list_lock);
+               list_for_each_safe(list, temp, &ha->done_queue) {
+                       rp = list_entry(list, srb_t, list);
 
-                               /*
-                               * Found command.  Just exit and wait for the
-                               * cmd sent to OS.
-                               */
-                               if (cmd == rp->cmd) {
-                                       found++;
-                                       DEBUG3(printk("%s: found in done "
-                                                       "queue.\n", __func__);)
-                                       break;
-                               }
+                       /*
+                        * Found command. Just exit and wait for the cmd sent
+                        * to OS.
+                       */
+                       if (cmd == rp->cmd) {
+                               found++;
+                               DEBUG3(printk("%s: found in done queue.\n",
+                                   __func__);)
+                               break;
                        }
-                       spin_unlock_irqrestore(&ha->list_lock, cpu_flags);
                }
+               spin_unlock(&ha->list_lock);
 
-               /* Checking to see if its returned to OS */
-               rp = (srb_t *) CMD_SP(cmd);
-               if (rp == NULL ) {
+               /* Complete the cmd right away. */
+               if (found) { 
+                       qla2x00_delete_from_done_queue(ha, rp);
+                       sp_put(ha, rp);
                        done++;
                        break;
                }
@@ -918,20 +928,14 @@ qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, struct scsi_cmnd *cmd)
                spin_unlock_irq(ha->host->host_lock);
 
                set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout(2*HZ);
+               schedule_timeout(ABORT_POLLING_PERIOD);
 
                spin_lock_irq(ha->host->host_lock);
 
        } while ((max_wait_time--));
 
-       if (done) {
+       if (done)
                DEBUG2(printk(KERN_INFO "%s: found cmd=%p.\n", __func__, cmd));
-       } else if (found) {
-               /* Immediately return command to the mid-layer */
-               qla2x00_delete_from_done_queue(ha, rp);
-               sp_put(ha, rp);
-               done++;
-       }
 
        return (done);
 }
@@ -953,7 +957,7 @@ qla2x00_eh_wait_on_command(scsi_qla_host_t *ha, struct scsi_cmnd *cmd)
  *    Success (Adapter is online) : 0
  *    Failed  (Adapter is offline/disabled) : 1
  */
-static inline int 
+int 
 qla2x00_wait_for_hba_online(scsi_qla_host_t *ha)
 {
        int      return_status;
@@ -962,16 +966,15 @@ qla2x00_wait_for_hba_online(scsi_qla_host_t *ha)
        wait_online = jiffies + (MAX_LOOP_TIMEOUT * HZ); 
        while (((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) ||
            test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) ||
-           test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)) &&
-               time_before(jiffies, wait_online)) {
+           test_bit(ISP_ABORT_RETRY, &ha->dpc_flags) ||
+           ha->dpc_active) && time_before(jiffies, wait_online)) {
 
                set_current_state(TASK_UNINTERRUPTIBLE);
                schedule_timeout(HZ);
        }
-       if (ha->flags.online == TRUE
+       if (ha->flags.online) 
                return_status = QLA_SUCCESS; 
        else
-               /* Adapter is disabled/offline */
                return_status = QLA_FUNCTION_FAILED;
 
        DEBUG2(printk("%s return_status=%d\n",__func__,return_status));
@@ -1046,7 +1049,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        struct Scsi_Host *host;
        uint8_t         found = 0;
        unsigned int    b, t, l;
-       unsigned long   flags;
 
        /* Get the SCSI request ptr */
        sp = (srb_t *) CMD_SP(cmd);
@@ -1061,7 +1063,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                qla_printk(KERN_INFO, to_qla_host(cmd->device->host),
                    "qla2xxx_eh_abort: cmd already done sp=%p\n", sp);
                DEBUG(printk("qla2xxx_eh_abort: cmd already done sp=%p\n", sp);)
-               return(SUCCESS);
+               return SUCCESS;
        }
        if (sp) {
                DEBUG(printk("qla2xxx_eh_abort: refcount %i \n",
@@ -1092,7 +1094,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                        "qla2x00: (%x:%x:%x) No LUN queue.\n", b, t, l);
 
                /* no action - we don't have command */
-               return(FAILED);
+               return FAILED;
        }
 
        DEBUG2(printk("scsi(%ld): ABORTing cmd=%p sp=%p jiffies = 0x%lx, "
@@ -1102,16 +1104,15 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        DEBUG2(qla2x00_print_scsi_cmd(cmd));
 
        spin_unlock_irq(ha->host->host_lock);
-       /* Blocking call-Does context switching if abort isp is active etc */  
        if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
                DEBUG2(printk("%s failed:board disabled\n", __func__);)
                spin_lock_irq(ha->host->host_lock);
-               return (FAILED);
+               return FAILED;
        }
        spin_lock_irq(ha->host->host_lock);
 
        /* Search done queue */
-       spin_lock_irqsave(&ha->list_lock,flags);
+       spin_lock(&ha->list_lock);
        list_for_each_safe(list, temp, &ha->done_queue) {
                rp = list_entry(list, srb_t, list);
 
@@ -1128,7 +1129,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
 
                break;
        } /* list_for_each_safe() */
-       spin_unlock_irqrestore(&ha->list_lock, flags);
+       spin_unlock(&ha->list_lock);
 
        /*
         * Return immediately if the aborted command was already in the done
@@ -1149,7 +1150,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        DEBUG3(printk("qla2xxx_eh_abort: searching sp %p in retry "
                    "queue.\n", sp);)
 
-       spin_lock_irqsave(&ha->list_lock, flags);
+       spin_lock(&ha->list_lock);
        list_for_each_safe(list, temp, &ha->retry_queue) {
                rp = list_entry(list, srb_t, list);
 
@@ -1170,7 +1171,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                break;
 
        } 
-       spin_unlock_irqrestore(&ha->list_lock, flags);
+       spin_unlock(&ha->list_lock);
 
 
        /*
@@ -1181,7 +1182,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
                    "in pending queue.\n", sp);)
 
-               spin_lock_irqsave(&vis_ha->list_lock, flags);
+               spin_lock(&vis_ha->list_lock);
                list_for_each_safe(list, temp, &vis_ha->pending_queue) {
                        rp = list_entry(list, srb_t, list);
 
@@ -1205,14 +1206,14 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                        found++;
                        break;
                } /* list_for_each_safe() */
-               spin_unlock_irqrestore(&vis_ha->list_lock, flags);
+               spin_unlock(&vis_ha->list_lock);
        } /*End of if !found */
 
        if (!found) {  /* find the command in our active list */
                DEBUG3(printk("qla2xxx_eh_abort: searching sp %p "
                    "in outstanding queue.\n", sp);)
 
-               spin_lock_irqsave(&ha->hardware_lock, flags);
+               spin_lock(&ha->hardware_lock);
                for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
                        sp = ha->outstanding_cmds[i];
 
@@ -1231,8 +1232,8 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                        /* Get a reference to the sp and drop the lock.*/
                        sp_get(ha, sp);
 
-                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
-                       spin_unlock(ha->host->host_lock);
+                       spin_unlock(&ha->hardware_lock);
+                       spin_unlock_irq(ha->host->host_lock);
 
                        if (qla2x00_abort_command(ha, sp)) {
                                DEBUG2(printk("qla2xxx_eh_abort: abort_command "
@@ -1247,7 +1248,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                        sp_put(ha,sp);
 
                        spin_lock_irq(ha->host->host_lock);
-                       spin_lock_irqsave(&ha->hardware_lock, flags);
+                       spin_lock(&ha->hardware_lock);
 
                        /*
                         * Regardless of mailbox command status, go check on
@@ -1256,11 +1257,11 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
                        break;
 
                }/*End of for loop */
-               spin_unlock_irqrestore(&ha->hardware_lock, flags);
+               spin_unlock(&ha->hardware_lock);
 
        } /*End of if !found */
 
-         /*Waiting for our command in done_queue to be returned to OS.*/
+       /* Waiting for our command in done_queue to be returned to OS.*/
        if (qla2x00_eh_wait_on_command(ha, cmd) != 0) {
                DEBUG2(printk("qla2xxx_eh_abort: cmd returned back to OS.\n");)
                return_status = SUCCESS;
@@ -1275,7 +1276,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
        DEBUG2(printk("qla2xxx_eh_abort: Exiting. return_status=0x%x.\n",
            return_status));
 
-       return(return_status);
+       return return_status;
 }
 
 /**************************************************************************
@@ -1297,7 +1298,6 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t)
 {
        int     cnt;
        int     status;
-       unsigned long   flags;
        srb_t           *sp;
        struct scsi_cmnd *cmd;
 
@@ -1308,11 +1308,11 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t)
         * array
         */
        for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
-               spin_lock_irqsave(&ha->hardware_lock, flags);
+               spin_lock(&ha->hardware_lock);
                sp = ha->outstanding_cmds[cnt];
                if (sp) {
                        cmd = sp->cmd;
-                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+                       spin_unlock(&ha->hardware_lock);
                        if (cmd->device->id == t) {
                                if (!qla2x00_eh_wait_on_command(ha, cmd)) {
                                        status = 1;
@@ -1321,7 +1321,7 @@ qla2x00_eh_wait_for_pending_target_commands(scsi_qla_host_t *ha, unsigned int t)
                        }
                }
                else {
-                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+                       spin_unlock(&ha->hardware_lock);
                }
        }
        return (status);
@@ -1356,7 +1356,6 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
        os_tgt_t        *tq;
        os_lun_t        *lq;
        fc_port_t       *fcport_to_reset;
-       unsigned long   flags;
        srb_t           *rp;
        struct list_head *list, *temp;
 
@@ -1404,7 +1403,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
            ha->dpc_flags, cmd->result, cmd->allowed, cmd->state));
 
        /* Clear commands from the retry queue. */
-       spin_lock_irqsave(&ha->list_lock, flags);
+       spin_lock(&ha->list_lock);
        list_for_each_safe(list, temp, &ha->retry_queue) {
                rp = list_entry(list, srb_t, list);
  
@@ -1418,11 +1417,10 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
                rp->cmd->result = DID_RESET << 16;
                __add_to_done_queue(ha, rp);
        }
-       spin_unlock_irqrestore(&ha->list_lock, flags);
+       spin_unlock(&ha->list_lock);
 
        spin_unlock_irq(ha->host->host_lock);
 
-       /* Blocking call-Does context switching if abort isp is active etc */  
        if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
                DEBUG2(printk(KERN_INFO
                    "%s failed:board disabled\n",__func__));
@@ -1431,7 +1429,6 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
                goto eh_dev_reset_done;
        }
 
-       /* Blocking call-Does context switching if loop is Not Ready */
        if (qla2x00_wait_for_loop_ready(ha) == QLA_SUCCESS) {
                if (qla2x00_device_reset(ha, fcport_to_reset) == 0) {
                        return_status = SUCCESS;
@@ -1455,7 +1452,7 @@ qla2xxx_eh_device_reset(struct scsi_cmnd *cmd)
 
        if (return_status == FAILED) {
                DEBUG3(printk("%s(%ld): device reset failed\n",
-                   __func__,ha->host_no));
+                   __func__, ha->host_no));
                qla_printk(KERN_INFO, ha, "%s: device reset failed\n",
                    __func__);
 
@@ -1513,7 +1510,6 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha)
 {
        int     cnt;
        int     status;
-       unsigned long   flags;
        srb_t           *sp;
        struct scsi_cmnd *cmd;
 
@@ -1524,17 +1520,17 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha)
         * array
         */
        for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
-               spin_lock_irqsave(&ha->hardware_lock, flags);
+               spin_lock(&ha->hardware_lock);
                sp = ha->outstanding_cmds[cnt];
                if (sp) {
                        cmd = sp->cmd;
-                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+                       spin_unlock(&ha->hardware_lock);
                        status = qla2x00_eh_wait_on_command(ha, cmd);
                        if (status == 0)
                                break;
                }
                else {
-                       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+                       spin_unlock(&ha->hardware_lock);
                }
        }
        return (status);
@@ -1572,16 +1568,14 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd)
 
        spin_unlock_irq(ha->host->host_lock);
 
-       /* Blocking call-Does context switching if abort isp is active etc*/  
        if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS) {
                DEBUG2(printk("%s failed:board disabled\n",__func__));
                spin_lock_irq(ha->host->host_lock);
                return FAILED;
        }
 
-       /* Blocking call-Does context switching if loop is Not Ready */ 
        if (qla2x00_wait_for_loop_ready(ha) == QLA_SUCCESS) {
-               if (qla2x00_loop_reset(ha)) 
+               if (qla2x00_loop_reset(ha) == QLA_SUCCESS
                        rval = SUCCESS;
        }
 
@@ -1639,7 +1633,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
 
        spin_unlock_irq(ha->host->host_lock);
 
-       /* Blocking call-Does context switching if abort isp is active etc*/  
        if (qla2x00_wait_for_hba_online(ha) != QLA_SUCCESS)
                goto board_disabled;
 
@@ -1697,10 +1690,10 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
 * Returns:
 *      0 = success
 */
-static uint8_t
+static int
 qla2x00_loop_reset(scsi_qla_host_t *ha)
 {
-       uint8_t  status = QLA_SUCCESS;
+       int status = QLA_SUCCESS;
        uint16_t t;
        os_tgt_t        *tq;
 
@@ -2111,15 +2104,9 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
        }
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-
        /* Enable chip interrupts. */
        qla2x00_enable_intrs(ha);
 
-       /* Insert new entry into the list of adapters */
-       write_lock(&qla_hostlist_lock);
-       list_add_tail(&ha->list, &qla_hostlist);
-       write_unlock(&qla_hostlist_lock);
-
        /* v2.19.5b6 */
        /*
         * Wait around max loop_reset_delay secs for the devices to come
@@ -2181,10 +2168,6 @@ void qla2x00_remove_one(struct pci_dev *pdev)
 
        ha = pci_get_drvdata(pdev);
 
-       write_lock(&qla_hostlist_lock);
-       list_del(&ha->list);
-       write_unlock(&qla_hostlist_lock);
-
        sysfs_remove_bin_file(&ha->host->shost_gendev.kobj,
            &sysfs_fw_dump_attr);
        sysfs_remove_bin_file(&ha->host->shost_gendev.kobj, &sysfs_nvram_attr);
@@ -2234,7 +2217,7 @@ qla2x00_free_device(scsi_qla_host_t *ha)
        qla2x00_mem_free(ha);
 
 
-       ha->flags.online = FALSE;
+       ha->flags.online = 0;
 
        /* Detach interrupts */
        if (ha->pdev->irq)
@@ -2305,12 +2288,12 @@ copy_info(struct info_str *info, char *fmt, ...)
 *
 * inout : decides the direction of the dataflow and the meaning of the
 *         variables
-* buffer: If inout==FALSE data is being written to it else read from it
+* buffer: If inout==0 data is being written to it else read from it
 *         (ptr to a page buffer)
-* *start: If inout==FALSE start of the valid data in the buffer
-* offset: If inout==FALSE starting offset from the beginning of all
+* *start: If inout==0 start of the valid data in the buffer
+* offset: If inout==0 starting offset from the beginning of all
 *         possible data to return.
-* length: If inout==FALSE max number of bytes to be written into the buffer
+* length: If inout==0 max number of bytes to be written into the buffer
 *         else number of bytes in "buffer"
 * Returns:
 *         < 0:  error. errno value.
@@ -2328,7 +2311,6 @@ qla2x00_proc_info(struct Scsi_Host *shost, char *buffer,
        uint32_t        tmp_sn;
        uint32_t        *flags;
        uint8_t         *loop_state;
-       int     found;
        scsi_qla_host_t *ha;
        char fw_info[30];
  
@@ -2336,29 +2318,9 @@ qla2x00_proc_info(struct Scsi_Host *shost, char *buffer,
            "Entering proc_info buff_in=%p, offset=0x%lx, length=0x%x\n",
            buffer, offset, length);)
 
-       ha = NULL;
-
-       /* Find the host that was specified */
-       found = 0;
-       read_lock(&qla_hostlist_lock);
-       list_for_each_entry(ha, &qla_hostlist, list) {
-               if (ha->host == shost) {
-                       found++;
-                       break;
-               }
-       }
-       read_unlock(&qla_hostlist_lock);
+       ha = (scsi_qla_host_t *) shost->hostdata;
 
-       /* if host wasn't found then exit */
-       if (!found) {
-               DEBUG2_3(printk(KERN_WARNING
-                   "%s: Can't find adapter for host %p\n", 
-                   __func__, shost);)
-
-               return (retval);
-       }
-
-       if (inout == TRUE) {
+       if (inout) {
                /* Has data been written to the file? */
                DEBUG3(printk(
                    "%s: has data been written to the file. \n",
@@ -2522,6 +2484,7 @@ qla2x00_proc_info(struct Scsi_Host *shost, char *buffer,
                    tq->port_name[4], tq->port_name[5],
                    tq->port_name[6], tq->port_name[7]);
        }
+
        copy_info(&info, "\nSCSI LUN Information:\n");
        copy_info(&info,
            "(Id:Lun)  * - indicates lun is not registered with the OS.\n");
@@ -3421,10 +3384,15 @@ qla2x00_do_dpc(void *data)
                                    fcport->login_retry) {
 
                                        fcport->login_retry--;
-                                       if (fcport->flags & FCF_FABRIC_DEVICE)
+                                       if (fcport->flags & FCF_FABRIC_DEVICE) {
+                                               if (fcport->flags &
+                                                   FCF_TAPE_PRESENT)
+                                                       qla2x00_fabric_logout(
+                                                           ha,
+                                                           fcport->loop_id);
                                                status = qla2x00_fabric_login(
                                                    ha, fcport, &next_loopid);
-                                       else    
+                                       } else
                                                status =
                                                    qla2x00_local_device_login(
                                                        ha, fcport->loop_id);
@@ -3494,7 +3462,7 @@ qla2x00_do_dpc(void *data)
                        DEBUG(printk("scsi(%ld): qla2x00_restart_queues()\n",
                            ha->host_no));
 
-                       qla2x00_restart_queues(ha,FALSE);
+                       qla2x00_restart_queues(ha, 0);
 
                        DEBUG(printk("scsi(%ld): qla2x00_restart_queues - end\n",
                            ha->host_no));
@@ -3505,7 +3473,7 @@ qla2x00_do_dpc(void *data)
                        DEBUG(printk("scsi(%ld): qla2x00_abort_queues()\n",
                            ha->host_no));
                                
-                       qla2x00_abort_queues(ha, FALSE);
+                       qla2x00_abort_queues(ha, 0);
 
                        DEBUG(printk("scsi(%ld): qla2x00_abort_queues - end\n",
                            ha->host_no));
@@ -3596,8 +3564,6 @@ qla2x00_rst_aen(scsi_qla_host_t *ha)
        if (ha->flags.online && !ha->flags.reset_active &&
            !atomic_read(&ha->loop_down_timer) &&
            !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) {
-
-               /* 10/15 ha->flags.reset_active = TRUE; */
                do {
                        clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
 
@@ -3608,8 +3574,6 @@ qla2x00_rst_aen(scsi_qla_host_t *ha)
                        ha->marker_needed = 1;
                } while (!atomic_read(&ha->loop_down_timer) &&
                    (test_bit(RESET_MARKER_NEEDED, &ha->dpc_flags)));
-
-               /* 10/15 ha->flags.reset_active = FALSE; */
        }
 }
 
@@ -3627,80 +3591,11 @@ qla2x00_get_new_sp(scsi_qla_host_t *ha)
        srb_t *sp;
 
        sp = mempool_alloc(ha->srb_mempool, GFP_KERNEL);
-       if (sp) {
+       if (sp)
                atomic_set(&sp->ref_count, 1);
-               sp->req_cnt = 0;
-       }
        return (sp);
 }
 
-/**************************************************************************
- * qla2x00_blink_led
- *
- * Description:
- *   This function sets the colour of the LED while preserving the
- *   unsued GPIO pins every sec.
- *
- * Input:
- *       ha - Host adapter structure
- *      
- * Return:
- *     None
- *
- * Context: qla2x00_timer() Interrupt
- ***************************************************************************/
-void
-qla2x00_blink_led(scsi_qla_host_t *ha)
-{
-       uint16_t        gpio_enable, gpio_data, led_color;
-       unsigned long   cpu_flags = 0;
-       device_reg_t    *reg = ha->iobase;
-
-       /* Save the Original GPIOE */ 
-       spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
-       gpio_enable = RD_REG_WORD(&reg->gpioe);
-       gpio_data = RD_REG_WORD(&reg->gpiod);
-       spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
-
-       DEBUG2(printk("%s Original data of gpio_enable_reg=0x%x"
-           " gpio_data_reg=0x%x\n",
-           __func__,gpio_enable,gpio_data));
-
-       if (ha->beacon_green_on){
-               led_color = GPIO_LED_GREEN_ON_AMBER_OFF;
-               ha->beacon_green_on = 0;
-       } else {
-               led_color = GPIO_LED_GREEN_OFF_AMBER_OFF;
-               ha->beacon_green_on = 1;
-       }
-
-       /* Set the modified gpio_enable values */
-       gpio_enable |= GPIO_LED_GREEN_ON_AMBER_OFF;
-
-       DEBUG2(printk("%s Before writing enable : gpio_enable_reg=0x%x"
-           " gpio_data_reg=0x%x led_color=0x%x\n",
-           __func__, gpio_enable, gpio_data, led_color));
-
-       spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
-       WRT_REG_WORD(&reg->gpioe,gpio_enable);
-       spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
-
-       /* Clear out the previously set LED colour */
-       gpio_data &= ~GPIO_LED_GREEN_ON_AMBER_OFF;
-
-       /* Set the new input LED colour to GPIOD */
-       gpio_data |= led_color;
-
-       DEBUG2(printk("%s Before writing data: gpio_enable_reg=0x%x"
-           " gpio_data_reg=0x%x led_color=0x%x\n",
-           __func__,gpio_enable,gpio_data,led_color));
-
-       /* Set the modified gpio_data values */
-       spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
-       WRT_REG_WORD(&reg->gpiod,gpio_data);
-       spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
-}
-
 /**************************************************************************
 *   qla2x00_timer
 *
@@ -3718,6 +3613,8 @@ qla2x00_timer(scsi_qla_host_t *ha)
        os_lun_t *lq;
        os_tgt_t *tq;
        int             start_dpc = 0;
+       int             index;
+       srb_t           *sp;
 
        /*
         * We try and restart any request in the retry queue every second.
@@ -3735,11 +3632,6 @@ qla2x00_timer(scsi_qla_host_t *ha)
                start_dpc++;
        }
 
-       /* Check if beacon LED needs to be blinked */
-       if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && ha->beacon_blink_led)
-               qla2x00_blink_led(ha);
-
-
        /*
         * Ports - Port down timer.
         *
@@ -3826,7 +3718,6 @@ qla2x00_timer(scsi_qla_host_t *ha)
        if (atomic_read(&ha->loop_down_timer) > 0 &&
            !(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) && ha->flags.online) {
 
-               /* dg 10/30 if (atomic_read(&ha->loop_down_timer) == LOOP_DOWN_TIME) { */
                if (atomic_read(&ha->loop_down_timer) ==
                    ha->loop_down_abort_time) {
 
@@ -3837,6 +3728,22 @@ qla2x00_timer(scsi_qla_host_t *ha)
                        if (!IS_QLA2100(ha) && ha->link_down_timeout)
                                atomic_set(&ha->loop_state, LOOP_DEAD); 
 
+                       /* Schedule an ISP abort to return any tape commands. */
+                       spin_lock_irqsave(&ha->hardware_lock, cpu_flags);
+                       for (index = 1; index < MAX_OUTSTANDING_COMMANDS;
+                           index++) {
+                               sp = ha->outstanding_cmds[index];
+                               if (!sp)
+                                       continue;
+                               if (!(sp->fclun->fcport->flags &
+                                   FCF_TAPE_PRESENT))
+                                       continue;
+
+                               set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+                               break;
+                       }
+                       spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags);
+
                        set_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags);
                        start_dpc++;
                }