diff options
Diffstat (limited to 'drivers/scsi/qla4xxx')
| -rw-r--r-- | drivers/scsi/qla4xxx/Makefile | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_attr.c | 69 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_def.h | 11 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_fw.h | 23 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_glbl.h | 3 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_init.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_isr.c | 22 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_mbx.c | 77 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_nx.c | 19 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 68 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_version.h | 2 | 
11 files changed, 218 insertions, 80 deletions
| diff --git a/drivers/scsi/qla4xxx/Makefile b/drivers/scsi/qla4xxx/Makefile index 0339ff03a535..252523d7847e 100644 --- a/drivers/scsi/qla4xxx/Makefile +++ b/drivers/scsi/qla4xxx/Makefile @@ -1,5 +1,5 @@  qla4xxx-y := ql4_os.o ql4_init.o ql4_mbx.o ql4_iocb.o ql4_isr.o \ -		ql4_nx.o ql4_nvram.o ql4_dbg.o +		ql4_nx.o ql4_nvram.o ql4_dbg.o ql4_attr.o  obj-$(CONFIG_SCSI_QLA_ISCSI) += qla4xxx.o diff --git a/drivers/scsi/qla4xxx/ql4_attr.c b/drivers/scsi/qla4xxx/ql4_attr.c new file mode 100644 index 000000000000..864d018631c0 --- /dev/null +++ b/drivers/scsi/qla4xxx/ql4_attr.c @@ -0,0 +1,69 @@ +/* + * QLogic iSCSI HBA Driver + * Copyright (c)  2003-2011 QLogic Corporation + * + * See LICENSE.qla4xxx for copyright and licensing details. + */ + +#include "ql4_def.h" +#include "ql4_glbl.h" +#include "ql4_dbg.h" + +/* Scsi_Host attributes. */ +static ssize_t +qla4xxx_fw_version_show(struct device *dev, +			struct device_attribute *attr, char *buf) +{ +	struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); + +	if (is_qla8022(ha)) +		return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n", +				ha->firmware_version[0], +				ha->firmware_version[1], +				ha->patch_number, ha->build_number); +	else +		return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d.%02d\n", +				ha->firmware_version[0], +				ha->firmware_version[1], +				ha->patch_number, ha->build_number); +} + +static ssize_t +qla4xxx_serial_num_show(struct device *dev, struct device_attribute *attr, +			char *buf) +{ +	struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); +	return snprintf(buf, PAGE_SIZE, "%s\n", ha->serial_number); +} + +static ssize_t +qla4xxx_iscsi_version_show(struct device *dev, struct device_attribute *attr, +			   char *buf) +{ +	struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); +	return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->iscsi_major, +			ha->iscsi_minor); +} + +static ssize_t +qla4xxx_optrom_version_show(struct device *dev, struct device_attribute *attr, +			    char *buf) +{ +	struct scsi_qla_host *ha = to_qla_host(class_to_shost(dev)); +	return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d.%02d\n", +			ha->bootload_major, ha->bootload_minor, +			ha->bootload_patch, ha->bootload_build); +} + +static DEVICE_ATTR(fw_version, S_IRUGO, qla4xxx_fw_version_show, NULL); +static DEVICE_ATTR(serial_num, S_IRUGO, qla4xxx_serial_num_show, NULL); +static DEVICE_ATTR(iscsi_version, S_IRUGO, qla4xxx_iscsi_version_show, NULL); +static DEVICE_ATTR(optrom_version, S_IRUGO, qla4xxx_optrom_version_show, NULL); + +struct device_attribute *qla4xxx_host_attrs[] = { +	&dev_attr_fw_version, +	&dev_attr_serial_num, +	&dev_attr_iscsi_version, +	&dev_attr_optrom_version, +	NULL, +}; diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h index 4757878d59dd..473c5c872b39 100644 --- a/drivers/scsi/qla4xxx/ql4_def.h +++ b/drivers/scsi/qla4xxx/ql4_def.h @@ -115,7 +115,7 @@  #define INVALID_ENTRY		0xFFFF  #define MAX_CMDS_TO_RISC	1024  #define MAX_SRBS		MAX_CMDS_TO_RISC -#define MBOX_AEN_REG_COUNT	5 +#define MBOX_AEN_REG_COUNT	8  #define MAX_INIT_RETRIES	5  /* @@ -368,7 +368,6 @@ struct scsi_qla_host {  #define AF_INIT_DONE			1 /* 0x00000002 */  #define AF_MBOX_COMMAND			2 /* 0x00000004 */  #define AF_MBOX_COMMAND_DONE		3 /* 0x00000008 */ -#define AF_DPC_SCHEDULED		5 /* 0x00000020 */  #define AF_INTERRUPTS_ON		6 /* 0x00000040 */  #define AF_GET_CRASH_RECORD		7 /* 0x00000080 */  #define AF_LINK_UP			8 /* 0x00000100 */ @@ -584,6 +583,14 @@ struct scsi_qla_host {  	uint32_t nx_reset_timeout;  	struct completion mbx_intr_comp; + +	/* --- From About Firmware --- */ +	uint16_t iscsi_major; +	uint16_t iscsi_minor; +	uint16_t bootload_major; +	uint16_t bootload_minor; +	uint16_t bootload_patch; +	uint16_t bootload_build;  };  static inline int is_ipv4_enabled(struct scsi_qla_host *ha) diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h index 31e2bf97198c..01082aa77098 100644 --- a/drivers/scsi/qla4xxx/ql4_fw.h +++ b/drivers/scsi/qla4xxx/ql4_fw.h @@ -690,6 +690,29 @@ struct mbx_sys_info {  	uint8_t reserved[12];		  /* 34-3f */  }; +struct about_fw_info { +	uint16_t fw_major;		/* 00 - 01 */ +	uint16_t fw_minor;		/* 02 - 03 */ +	uint16_t fw_patch;		/* 04 - 05 */ +	uint16_t fw_build;		/* 06 - 07 */ +	uint8_t fw_build_date[16];	/* 08 - 17 ASCII String */ +	uint8_t fw_build_time[16];	/* 18 - 27 ASCII String */ +	uint8_t fw_build_user[16];	/* 28 - 37 ASCII String */ +	uint16_t fw_load_source;	/* 38 - 39 */ +					/* 1 = Flash Primary, +					   2 = Flash Secondary, +					   3 = Host Download +					*/ +	uint8_t reserved1[6];		/* 3A - 3F */ +	uint16_t iscsi_major;		/* 40 - 41 */ +	uint16_t iscsi_minor;		/* 42 - 43 */ +	uint16_t bootload_major;	/* 44 - 45 */ +	uint16_t bootload_minor;	/* 46 - 47 */ +	uint16_t bootload_patch;	/* 48 - 49 */ +	uint16_t bootload_build;	/* 4A - 4B */ +	uint8_t reserved2[180];		/* 4C - FF */ +}; +  struct crash_record {  	uint16_t fw_major_version;	/* 00 - 01 */  	uint16_t fw_minor_version;	/* 02 - 03 */ diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h index cc53e3fbd78c..a53a256c1f8d 100644 --- a/drivers/scsi/qla4xxx/ql4_glbl.h +++ b/drivers/scsi/qla4xxx/ql4_glbl.h @@ -61,7 +61,7 @@ struct ddb_entry *qla4xxx_alloc_sess(struct scsi_qla_host *ha);  int qla4xxx_add_sess(struct ddb_entry *);  void qla4xxx_destroy_sess(struct ddb_entry *ddb_entry);  int qla4xxx_is_nvram_configuration_valid(struct scsi_qla_host *ha); -int qla4xxx_get_fw_version(struct scsi_qla_host * ha); +int qla4xxx_about_firmware(struct scsi_qla_host *ha);  void qla4xxx_interrupt_service_routine(struct scsi_qla_host *ha,  				       uint32_t intr_status);  int qla4xxx_init_rings(struct scsi_qla_host *ha); @@ -139,4 +139,5 @@ extern int ql4xextended_error_logging;  extern int ql4xdontresethba;  extern int ql4xenablemsix; +extern struct device_attribute *qla4xxx_host_attrs[];  #endif /* _QLA4x_GBL_H */ diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c index 48e2241ddaf4..42ed5db2d530 100644 --- a/drivers/scsi/qla4xxx/ql4_init.c +++ b/drivers/scsi/qla4xxx/ql4_init.c @@ -1275,7 +1275,7 @@ int qla4xxx_initialize_adapter(struct scsi_qla_host *ha,  	if (ha->isp_ops->start_firmware(ha) == QLA_ERROR)  		goto exit_init_hba; -	if (qla4xxx_get_fw_version(ha) == QLA_ERROR) +	if (qla4xxx_about_firmware(ha) == QLA_ERROR)  		goto exit_init_hba;  	if (ha->isp_ops->get_sys_info(ha) == QLA_ERROR) diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c index 2f40ac761cd4..0e72921c752d 100644 --- a/drivers/scsi/qla4xxx/ql4_isr.c +++ b/drivers/scsi/qla4xxx/ql4_isr.c @@ -25,9 +25,14 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,  	memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);  	sense_len = le16_to_cpu(sts_entry->senseDataByteCnt); -	if (sense_len == 0) +	if (sense_len == 0) { +		DEBUG2(ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%d:%d: %s:" +				  " sense len 0\n", ha->host_no, +				  cmd->device->channel, cmd->device->id, +				  cmd->device->lun, __func__)); +		ha->status_srb = NULL;  		return; - +	}  	/* Save total available sense length,  	 * not to exceed cmd's sense buffer size */  	sense_len = min_t(uint16_t, sense_len, SCSI_SENSE_BUFFERSIZE); @@ -541,6 +546,7 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,  		case MBOX_ASTS_UNSOLICITED_PDU_RECEIVED:  /* Connection mode */  		case MBOX_ASTS_IPSEC_SYSTEM_FATAL_ERROR:  		case MBOX_ASTS_SUBNET_STATE_CHANGE: +		case MBOX_ASTS_DUPLICATE_IP:  			/* No action */  			DEBUG2(printk("scsi%ld: AEN %04x\n", ha->host_no,  				      mbox_status)); @@ -593,11 +599,13 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,  					    mbox_sts[i];  				/* print debug message */ -				DEBUG2(printk("scsi%ld: AEN[%d] %04x queued" -				    " mb1:0x%x mb2:0x%x mb3:0x%x mb4:0x%x\n", -				    ha->host_no, ha->aen_in, mbox_sts[0], -				    mbox_sts[1], mbox_sts[2],  mbox_sts[3], -				    mbox_sts[4])); +				DEBUG2(printk("scsi%ld: AEN[%d] %04x queued " +					      "mb1:0x%x mb2:0x%x mb3:0x%x " +					      "mb4:0x%x mb5:0x%x\n", +					      ha->host_no, ha->aen_in, +					      mbox_sts[0], mbox_sts[1], +					      mbox_sts[2], mbox_sts[3], +					      mbox_sts[4], mbox_sts[5]));  				/* advance pointer */  				ha->aen_in++; diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index d78b58dc5011..fce8289e9752 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c @@ -86,22 +86,8 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,  		msleep(10);  	} -	/* To prevent overwriting mailbox registers for a command that has -	 * not yet been serviced, check to see if an active command -	 * (AEN, IOCB, etc.) is interrupting, then service it. -	 * ----------------------------------------------------------------- -	 */  	spin_lock_irqsave(&ha->hardware_lock, flags); -	if (!is_qla8022(ha)) { -		intr_status = readl(&ha->reg->ctrl_status); -		if (intr_status & CSR_SCSI_PROCESSOR_INTR) { -			/* Service existing interrupt */ -			ha->isp_ops->interrupt_service_routine(ha, intr_status); -			clear_bit(AF_MBOX_COMMAND_DONE, &ha->flags); -		} -	} -  	ha->mbox_status_count = outCount;  	for (i = 0; i < outCount; i++)  		ha->mbox_status[i] = 0; @@ -1057,38 +1043,65 @@ int qla4xxx_get_flash(struct scsi_qla_host * ha, dma_addr_t dma_addr,  }  /** - * qla4xxx_get_fw_version - gets firmware version + * qla4xxx_about_firmware - gets FW, iscsi draft and boot loader version   * @ha: Pointer to host adapter structure.   * - * Retrieves the firmware version on HBA. In QLA4010, mailboxes 2 & 3 may - * hold an address for data.  Make sure that we write 0 to those mailboxes, - * if unused. + * Retrieves the FW version, iSCSI draft version & bootloader version of HBA. + * Mailboxes 2 & 3 may hold an address for data. Make sure that we write 0 to + * those mailboxes, if unused.   **/ -int qla4xxx_get_fw_version(struct scsi_qla_host * ha) +int qla4xxx_about_firmware(struct scsi_qla_host *ha)  { +	struct about_fw_info *about_fw = NULL; +	dma_addr_t about_fw_dma;  	uint32_t mbox_cmd[MBOX_REG_COUNT];  	uint32_t mbox_sts[MBOX_REG_COUNT]; +	int status = QLA_ERROR; + +	about_fw = dma_alloc_coherent(&ha->pdev->dev, +				      sizeof(struct about_fw_info), +				      &about_fw_dma, GFP_KERNEL); +	if (!about_fw) { +		DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Unable to alloc memory " +				  "for about_fw\n", __func__)); +		return status; +	} -	/* Get firmware version. */ +	memset(about_fw, 0, sizeof(struct about_fw_info));  	memset(&mbox_cmd, 0, sizeof(mbox_cmd));  	memset(&mbox_sts, 0, sizeof(mbox_sts));  	mbox_cmd[0] = MBOX_CMD_ABOUT_FW; - -	if (qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, 5, &mbox_cmd[0], &mbox_sts[0]) != -	    QLA_SUCCESS) { -		DEBUG2(printk("scsi%ld: %s: MBOX_CMD_ABOUT_FW failed w/ " -		    "status %04X\n", ha->host_no, __func__, mbox_sts[0])); -		return QLA_ERROR; +	mbox_cmd[2] = LSDW(about_fw_dma); +	mbox_cmd[3] = MSDW(about_fw_dma); +	mbox_cmd[4] = sizeof(struct about_fw_info); + +	status = qla4xxx_mailbox_command(ha, MBOX_REG_COUNT, MBOX_REG_COUNT, +					 &mbox_cmd[0], &mbox_sts[0]); +	if (status != QLA_SUCCESS) { +		DEBUG2(ql4_printk(KERN_WARNING, ha, "%s: MBOX_CMD_ABOUT_FW " +				  "failed w/ status %04X\n", __func__, +				  mbox_sts[0])); +		goto exit_about_fw;  	} -	/* Save firmware version information. */ -	ha->firmware_version[0] = mbox_sts[1]; -	ha->firmware_version[1] = mbox_sts[2]; -	ha->patch_number = mbox_sts[3]; -	ha->build_number = mbox_sts[4]; +	/* Save version information. */ +	ha->firmware_version[0] = le16_to_cpu(about_fw->fw_major); +	ha->firmware_version[1] = le16_to_cpu(about_fw->fw_minor); +	ha->patch_number = le16_to_cpu(about_fw->fw_patch); +	ha->build_number = le16_to_cpu(about_fw->fw_build); +	ha->iscsi_major = le16_to_cpu(about_fw->iscsi_major); +	ha->iscsi_minor = le16_to_cpu(about_fw->iscsi_minor); +	ha->bootload_major = le16_to_cpu(about_fw->bootload_major); +	ha->bootload_minor = le16_to_cpu(about_fw->bootload_minor); +	ha->bootload_patch = le16_to_cpu(about_fw->bootload_patch); +	ha->bootload_build = le16_to_cpu(about_fw->bootload_build); +	status = QLA_SUCCESS; -	return QLA_SUCCESS; +exit_about_fw: +	dma_free_coherent(&ha->pdev->dev, sizeof(struct about_fw_info), +			  about_fw, about_fw_dma); +	return status;  }  static int qla4xxx_get_default_ddb(struct scsi_qla_host *ha, diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c index 03e522b2fe0b..fdfe27b38698 100644 --- a/drivers/scsi/qla4xxx/ql4_nx.c +++ b/drivers/scsi/qla4xxx/ql4_nx.c @@ -964,12 +964,26 @@ qla4_8xxx_pinit_from_rom(struct scsi_qla_host *ha, int verbose)  	/* Halt all the indiviual PEGs and other blocks of the ISP */  	qla4_8xxx_rom_lock(ha); -	/* mask all niu interrupts */ +	/* disable all I2Q */ +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_I2Q + 0x10, 0x0); +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_I2Q + 0x14, 0x0); +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_I2Q + 0x18, 0x0); +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_I2Q + 0x1c, 0x0); +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_I2Q + 0x20, 0x0); +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_I2Q + 0x24, 0x0); + +	/* disable all niu interrupts */  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x40, 0xff);  	/* disable xge rx/tx */  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x70000, 0x00);  	/* disable xg1 rx/tx */  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x80000, 0x00); +	/* disable sideband mac */ +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0x90000, 0x00); +	/* disable ap0 mac */ +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0xa0000, 0x00); +	/* disable ap1 mac */ +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_NIU + 0xb0000, 0x00);  	/* halt sre */  	val = qla4_8xxx_rd_32(ha, QLA82XX_CRB_SRE + 0x1000); @@ -984,6 +998,7 @@ qla4_8xxx_pinit_from_rom(struct scsi_qla_host *ha, int verbose)  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_TIMER + 0x10, 0x0);  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_TIMER + 0x18, 0x0);  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_TIMER + 0x100, 0x0); +	qla4_8xxx_wr_32(ha, QLA82XX_CRB_TIMER + 0x200, 0x0);  	/* halt pegs */  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_PEG_NET_0 + 0x3c, 1); @@ -991,9 +1006,9 @@ qla4_8xxx_pinit_from_rom(struct scsi_qla_host *ha, int verbose)  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_PEG_NET_2 + 0x3c, 1);  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_PEG_NET_3 + 0x3c, 1);  	qla4_8xxx_wr_32(ha, QLA82XX_CRB_PEG_NET_4 + 0x3c, 1); +	msleep(5);  	/* big hammer */ -	msleep(1000);  	if (test_bit(DPC_RESET_HA, &ha->dpc_flags))  		/* don't reset CAM block on reset */  		qla4_8xxx_wr_32(ha, QLA82XX_ROMUSB_GLB_SW_RESET, 0xfeffffff); diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index c22f2a764d9d..f2364ec59f03 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c @@ -124,6 +124,7 @@ static struct scsi_host_template qla4xxx_driver_template = {  	.sg_tablesize		= SG_ALL,  	.max_sectors		= 0xFFFF, +	.shost_attrs		= qla4xxx_host_attrs,  };  static struct iscsi_transport qla4xxx_iscsi_transport = { @@ -412,8 +413,7 @@ void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha)  static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,  				       struct ddb_entry *ddb_entry, -				       struct scsi_cmnd *cmd, -				       void (*done)(struct scsi_cmnd *)) +				       struct scsi_cmnd *cmd)  {  	struct srb *srb; @@ -427,7 +427,6 @@ static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,  	srb->cmd = cmd;  	srb->flags = 0;  	CMD_SP(cmd) = (void *)srb; -	cmd->scsi_done = done;  	return srb;  } @@ -458,9 +457,8 @@ void qla4xxx_srb_compl(struct kref *ref)  /**   * qla4xxx_queuecommand - scsi layer issues scsi command to driver. + * @host: scsi host   * @cmd: Pointer to Linux's SCSI command structure - * @done_fn: Function that the driver calls to notify the SCSI mid-layer - *	that the command has been processed.   *   * Remarks:   * This routine is invoked by Linux to send a SCSI command to the driver. @@ -470,10 +468,9 @@ void qla4xxx_srb_compl(struct kref *ref)   * completion handling).   Unfortunely, it sometimes calls the scheduler   * in interrupt context which is a big NO! NO!.   **/ -static int qla4xxx_queuecommand_lck(struct scsi_cmnd *cmd, -				void (*done)(struct scsi_cmnd *)) +static int qla4xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)  { -	struct scsi_qla_host *ha = to_qla_host(cmd->device->host); +	struct scsi_qla_host *ha = to_qla_host(host);  	struct ddb_entry *ddb_entry = cmd->device->hostdata;  	struct iscsi_cls_session *sess = ddb_entry->sess;  	struct srb *srb; @@ -515,37 +512,29 @@ static int qla4xxx_queuecommand_lck(struct scsi_cmnd *cmd,  	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))  		goto qc_host_busy; -	spin_unlock_irq(ha->host->host_lock); - -	srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd, done); +	srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd);  	if (!srb) -		goto qc_host_busy_lock; +		goto qc_host_busy;  	rval = qla4xxx_send_command_to_isp(ha, srb);  	if (rval != QLA_SUCCESS)  		goto qc_host_busy_free_sp; -	spin_lock_irq(ha->host->host_lock);  	return 0;  qc_host_busy_free_sp:  	qla4xxx_srb_free_dma(ha, srb);  	mempool_free(srb, ha->srb_mempool); -qc_host_busy_lock: -	spin_lock_irq(ha->host->host_lock); -  qc_host_busy:  	return SCSI_MLQUEUE_HOST_BUSY;  qc_fail_command: -	done(cmd); +	cmd->scsi_done(cmd);  	return 0;  } -static DEF_SCSI_QCMD(qla4xxx_queuecommand) -  /**   * qla4xxx_mem_free - frees memory allocated to adapter   * @ha: Pointer to host adapter structure. @@ -679,7 +668,27 @@ static void qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha)  		if (ha->seconds_since_last_heartbeat == 2) {  			ha->seconds_since_last_heartbeat = 0;  			halt_status = qla4_8xxx_rd_32(ha, -			    QLA82XX_PEG_HALT_STATUS1); +						      QLA82XX_PEG_HALT_STATUS1); + +			ql4_printk(KERN_INFO, ha, +				   "scsi(%ld): %s, Dumping hw/fw registers:\n " +				   " PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2:" +				   " 0x%x,\n PEG_NET_0_PC: 0x%x, PEG_NET_1_PC:" +				   " 0x%x,\n PEG_NET_2_PC: 0x%x, PEG_NET_3_PC:" +				   " 0x%x,\n PEG_NET_4_PC: 0x%x\n", +				   ha->host_no, __func__, halt_status, +				   qla4_8xxx_rd_32(ha, +						   QLA82XX_PEG_HALT_STATUS2), +				   qla4_8xxx_rd_32(ha, QLA82XX_CRB_PEG_NET_0 + +						   0x3c), +				   qla4_8xxx_rd_32(ha, QLA82XX_CRB_PEG_NET_1 + +						   0x3c), +				   qla4_8xxx_rd_32(ha, QLA82XX_CRB_PEG_NET_2 + +						   0x3c), +				   qla4_8xxx_rd_32(ha, QLA82XX_CRB_PEG_NET_3 + +						   0x3c), +				   qla4_8xxx_rd_32(ha, QLA82XX_CRB_PEG_NET_4 + +						   0x3c));  			/* Since we cannot change dev_state in interrupt  			 * context, set appropriate DPC flag then wakeup @@ -715,7 +724,7 @@ void qla4_8xxx_watchdog(struct scsi_qla_host *ha)  	/* don't poll if reset is going on */  	if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) ||  	    test_bit(DPC_RESET_HA, &ha->dpc_flags) || -	    test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags))) { +	    test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) {  		if (dev_state == QLA82XX_DEV_NEED_RESET &&  		    !test_bit(DPC_RESET_HA, &ha->dpc_flags)) {  			if (!ql4xdontresethba) { @@ -839,7 +848,7 @@ static void qla4xxx_timer(struct scsi_qla_host *ha)  	}  	/* Wakeup the dpc routine for this adapter, if needed. */ -	if ((start_dpc || +	if (start_dpc ||  	     test_bit(DPC_RESET_HA, &ha->dpc_flags) ||  	     test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) ||  	     test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) || @@ -849,9 +858,7 @@ static void qla4xxx_timer(struct scsi_qla_host *ha)  	     test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) ||  	     test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) ||  	     test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) || -	     test_bit(DPC_AEN, &ha->dpc_flags)) && -	     !test_bit(AF_DPC_SCHEDULED, &ha->flags) && -	     ha->dpc_thread) { +	     test_bit(DPC_AEN, &ha->dpc_flags)) {  		DEBUG2(printk("scsi%ld: %s: scheduling dpc routine"  			      " - dpc flags = 0x%lx\n",  			      ha->host_no, __func__, ha->dpc_flags)); @@ -1241,11 +1248,8 @@ static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha)  void qla4xxx_wake_dpc(struct scsi_qla_host *ha)  { -	if (ha->dpc_thread && -	    !test_bit(AF_DPC_SCHEDULED, &ha->flags)) { -		set_bit(AF_DPC_SCHEDULED, &ha->flags); +	if (ha->dpc_thread)  		queue_work(ha->dpc_thread, &ha->dpc_work); -	}  }  /** @@ -1272,12 +1276,12 @@ static void qla4xxx_do_dpc(struct work_struct *work)  	/* Initialization not yet finished. Don't do anything yet. */  	if (!test_bit(AF_INIT_DONE, &ha->flags)) -		goto do_dpc_exit; +		return;  	if (test_bit(AF_EEH_BUSY, &ha->flags)) {  		DEBUG2(printk(KERN_INFO "scsi%ld: %s: flags = %lx\n",  		    ha->host_no, __func__, ha->flags)); -		goto do_dpc_exit; +		return;  	}  	if (is_qla8022(ha)) { @@ -1384,8 +1388,6 @@ dpc_post_reset_ha:  		}  	} -do_dpc_exit: -	clear_bit(AF_DPC_SCHEDULED, &ha->flags);  }  /** diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h index 603155769407..610492877253 100644 --- a/drivers/scsi/qla4xxx/ql4_version.h +++ b/drivers/scsi/qla4xxx/ql4_version.h @@ -5,4 +5,4 @@   * See LICENSE.qla4xxx for copyright and licensing details.   */ -#define QLA4XXX_DRIVER_VERSION	"5.02.00-k6" +#define QLA4XXX_DRIVER_VERSION	"5.02.00-k7" | 
