Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb8dacbf authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Add hardware trace-logging support.



Recent ISPs have a region within FLASH which acts as a repository
for the logging of serious hardware and software failures.
Currently, the region is large enough to support up to 255
entries.

Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 0971de7f
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2118,6 +2118,7 @@ struct qla_msix_entry {
/* Work events.  */
enum qla_work_type {
	QLA_EVT_AEN,
	QLA_EVT_HWE_LOG,
};


@@ -2132,6 +2133,10 @@ struct qla_work_evt {
			enum fc_host_event_code code;
			u32 data;
		} aen;
		struct {
			uint16_t code;
			uint16_t d1, d2, d3;
		} hwe;
	} u;
};

@@ -2173,6 +2178,7 @@ typedef struct scsi_qla_host {
		uint32_t        vsan_enabled            :1;
		uint32_t	npiv_supported		:1;
		uint32_t	fce_enabled		:1;
		uint32_t	hw_event_marker_found	:1;
	} flags;

	atomic_t	loop_state;
@@ -2478,6 +2484,10 @@ typedef struct scsi_qla_host {
	uint64_t	fce_wr, fce_rd;
	struct mutex	fce_mutex;

	uint32_t	hw_event_start;
	uint32_t	hw_event_ptr;
	uint32_t	hw_event_pause_errors;

	uint8_t		host_str[16];
	uint32_t	pci_attr;
	uint16_t	chip_revision;
+13 −1
Original line number Diff line number Diff line
@@ -793,7 +793,19 @@ struct device_reg_24xx {
#define FA_VPD_NVRAM_ADDR	0x48000
#define FA_FEATURE_ADDR		0x4C000
#define FA_FLASH_DESCR_ADDR	0x50000
#define FA_HW_EVENT_ADDR	0x54000
#define FA_HW_EVENT0_ADDR	0x54000
#define FA_HW_EVENT1_ADDR	0x54200
#define FA_HW_EVENT_SIZE	0x200
#define FA_HW_EVENT_ENTRY_SIZE	4
/*
 * Flash Error Log Event Codes.
 */
#define HW_EVENT_RESET_ERR	0xF00B
#define HW_EVENT_ISP_ERR	0xF020
#define HW_EVENT_PARITY_ERR	0xF022
#define HW_EVENT_NVRAM_CHKSUM_ERR	0xF023
#define HW_EVENT_FLASH_FW_ERR	0xF024

#define FA_BOOT_LOG_ADDR	0x58000
#define FA_FW_DUMP0_ADDR	0x60000
#define FA_FW_DUMP1_ADDR	0x70000
+5 −0
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ extern int qla2x00_loop_reset(scsi_qla_host_t *);
extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum
    fc_host_event_code, u32);
extern int qla2x00_post_hwe_work(struct scsi_qla_host *, uint16_t , uint16_t,
    uint16_t, uint16_t);

/*
 * Global Functions in qla_mid.c source file.
@@ -298,6 +300,9 @@ extern uint8_t *qla25xx_read_optrom_data(struct scsi_qla_host *, uint8_t *,
extern int qla2x00_get_flash_version(scsi_qla_host_t *, void *);
extern int qla24xx_get_flash_version(scsi_qla_host_t *, void *);

extern int qla2xxx_hw_event_log(scsi_qla_host_t *, uint16_t , uint16_t,
    uint16_t, uint16_t);

/*
 * Global Function Prototypes in qla_dbg.c source file.
 */
+11 −0
Original line number Diff line number Diff line
@@ -500,6 +500,7 @@ qla2x00_reset_chip(scsi_qla_host_t *ha)
static inline void
qla24xx_reset_risc(scsi_qla_host_t *ha)
{
	int hw_evt = 0;
	unsigned long flags = 0;
	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
	uint32_t cnt, d2;
@@ -528,6 +529,8 @@ qla24xx_reset_risc(scsi_qla_host_t *ha)
		d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
		barrier();
	}
	if (cnt == 0)
		hw_evt = 1;

	/* Wait for soft-reset to complete. */
	d2 = RD_REG_DWORD(&reg->ctrl_status);
@@ -536,6 +539,10 @@ qla24xx_reset_risc(scsi_qla_host_t *ha)
		d2 = RD_REG_DWORD(&reg->ctrl_status);
		barrier();
	}
	if (cnt == 0 || hw_evt)
		qla2xxx_hw_event_log(ha, HW_EVENT_RESET_ERR,
		    RD_REG_WORD(&reg->mailbox1), RD_REG_WORD(&reg->mailbox2),
		    RD_REG_WORD(&reg->mailbox3));

	WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET);
	RD_REG_DWORD(&reg->hccr);
@@ -1555,6 +1562,10 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
		qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet "
		    "invalid -- WWPN) defaults.\n");

		if (chksum)
			qla2xxx_hw_event_log(ha, HW_EVENT_NVRAM_CHKSUM_ERR, 0,
			    MSW(chksum), LSW(chksum));

		/*
		 * Set default initialization control block.
		 */
+15 −0
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
		    "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n",
		    mb[1], mb[2], mb[3]);

		qla2x00_post_hwe_work(ha, mb[0], mb[1], mb[2], mb[3]);
		ha->isp_ops->fw_dump(ha, 1);

		if (IS_FWI2_CAPABLE(ha)) {
@@ -373,6 +374,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
		    ha->host_no));
		qla_printk(KERN_WARNING, ha, "ISP Request Transfer Error.\n");

		qla2x00_post_hwe_work(ha, mb[0], mb[1], mb[2], mb[3]);
		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
		break;

@@ -381,6 +383,7 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
		    ha->host_no));
		qla_printk(KERN_WARNING, ha, "ISP Response Transfer Error.\n");

		qla2x00_post_hwe_work(ha, mb[0], mb[1], mb[2], mb[3]);
		set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
		break;

@@ -1558,6 +1561,12 @@ qla24xx_intr_handler(int irq, void *dev_id)
			if (pci_channel_offline(ha->pdev))
				break;

			if (ha->hw_event_pause_errors == 0)
				qla2x00_post_hwe_work(ha, HW_EVENT_PARITY_ERR,
				    0, MSW(stat), LSW(stat));
			else if (ha->hw_event_pause_errors < 0xffffffff)
				ha->hw_event_pause_errors++;

			hccr = RD_REG_DWORD(&reg->hccr);

			qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, "
@@ -1693,6 +1702,12 @@ qla24xx_msix_default(int irq, void *dev_id)
			if (pci_channel_offline(ha->pdev))
				break;

			if (ha->hw_event_pause_errors == 0)
				qla2x00_post_hwe_work(ha, HW_EVENT_PARITY_ERR,
				    0, MSW(stat), LSW(stat));
			else if (ha->hw_event_pause_errors < 0xffffffff)
				ha->hw_event_pause_errors++;

			hccr = RD_REG_DWORD(&reg->hccr);

			qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, "
Loading