X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fscsi%2Fqla2xxx%2Fqla_os.c;h=dd5aaba4e257dbf8d2602d19013aa9d0a494975a;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=cf3b81211e924cc6d6a69947327980571701cbe0;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index cf3b81211..dd5aaba4e 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -16,10 +16,17 @@ * General Public License for more details. * */ - -#include "qla_os.h" #include "qla_def.h" +#include +#include +#include + +#include +#include +#include +#include + /* * 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 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(®->gpioe); - gpio_data = RD_REG_WORD(®->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(®->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(®->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++; }