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

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

[SCSI] qla2xxx: Add Flash Layout Table support.



The Flash Layout Table (FLT) present on many recent HBAs encodes
flash usage information, organizes data stored into separate
regions and presents the information uniformly to the driver.
Use this information rather than using specific hard-coded values
based on ISP type.

Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 4b89258c
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -292,10 +292,11 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj,
		valid = 0;
		if (ha->optrom_size == OPTROM_SIZE_2300 && start == 0)
			valid = 1;
		else if (start == (FA_BOOT_CODE_ADDR*4) ||
		    start == (FA_RISC_CODE_ADDR*4))
		else if (start == (ha->flt_region_boot * 4) ||
		    start == (ha->flt_region_fw * 4))
			valid = 1;
		else if (IS_QLA25XX(ha) && start == (FA_VPD_NVRAM_ADDR*4))
		else if (IS_QLA25XX(ha) &&
		    start == (ha->flt_region_vpd_nvram * 4))
		    valid = 1;
		if (!valid) {
			qla_printk(KERN_WARNING, ha,
+7 −1
Original line number Diff line number Diff line
@@ -2508,7 +2508,6 @@ 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;

@@ -2554,6 +2553,13 @@ typedef struct scsi_qla_host {
	uint32_t	fdt_unprotect_sec_cmd;
	uint32_t	fdt_protect_sec_cmd;

	uint32_t	flt_region_flt;
	uint32_t	flt_region_fdt;
	uint32_t	flt_region_boot;
	uint32_t	flt_region_fw;
	uint32_t	flt_region_vpd_nvram;
	uint32_t	flt_region_hw_event;

	/* Needed for BEACON */
	uint16_t	beacon_blink_led;
	uint8_t		beacon_color_state;
+40 −5
Original line number Diff line number Diff line
@@ -789,12 +789,16 @@ struct device_reg_24xx {
#define FA_RISC_CODE_ADDR	0x20000
#define FA_RISC_CODE_SEGMENTS	2

#define FA_FLASH_DESCR_ADDR_24	0x11000
#define FA_FLASH_LAYOUT_ADDR_24	0x11400

#define FA_FW_AREA_ADDR		0x40000
#define FA_VPD_NVRAM_ADDR	0x48000
#define FA_FEATURE_ADDR		0x4C000
#define FA_FLASH_DESCR_ADDR	0x50000
#define FA_FLASH_LAYOUT_ADDR	0x50400
#define FA_HW_EVENT0_ADDR	0x54000
#define FA_HW_EVENT1_ADDR	0x54200
#define FA_HW_EVENT1_ADDR	0x54400
#define FA_HW_EVENT_SIZE	0x200
#define FA_HW_EVENT_ENTRY_SIZE	4
/*
@@ -806,10 +810,6 @@ struct device_reg_24xx {
#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

	uint32_t flash_data;		/* Flash/NVRAM BIOS data. */

	uint32_t ctrl_status;		/* Control/Status. */
@@ -1203,6 +1203,41 @@ struct qla_fdt_layout {
	uint8_t unused2[65];
};

/* Flash Layout Table ********************************************************/

struct qla_flt_location {
	uint8_t sig[4];
	uint32_t start_lo;
	uint32_t start_hi;
	uint16_t unused;
	uint16_t checksum;
};

struct qla_flt_header {
	uint16_t version;
	uint16_t length;
	uint16_t checksum;
	uint16_t unused;
};

#define FLT_REG_FW		0x01
#define FLT_REG_BOOT_CODE	0x07
#define FLT_REG_VPD_0		0x14
#define FLT_REG_NVRAM_0		0x15
#define FLT_REG_VPD_1		0x16
#define FLT_REG_NVRAM_1		0x17
#define FLT_REG_FDT		0x1a
#define FLT_REG_FLT		0x1c
#define FLT_REG_HW_EVENT_0	0x1d
#define FLT_REG_HW_EVENT_1	0x1f

struct qla_flt_region {
	uint32_t code;
	uint32_t size;
	uint32_t start;
	uint32_t end;
};

/* 84XX Support **************************************************************/

#define MBA_ISP84XX_ALERT	0x800f  /* Alert Notification. */
+1 −1
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ 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);

extern void qla2xxx_get_flash_info(scsi_qla_host_t *);
extern int qla2xxx_get_flash_info(scsi_qla_host_t *);
extern int qla2xxx_get_vpd_field(scsi_qla_host_t *, char *, char *, size_t);

/*
+8 −2
Original line number Diff line number Diff line
@@ -83,6 +83,13 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha)

	ha->isp_ops->reset_chip(ha);

	rval = qla2xxx_get_flash_info(ha);
	if (rval) {
		DEBUG2(printk("scsi(%ld): Unable to validate FLASH data.\n",
		    ha->host_no));
		return (rval);
	}

	ha->isp_ops->get_flash_version(ha, ha->request_ring);

	qla_printk(KERN_INFO, ha, "Configure NVRAM parameters...\n");
@@ -109,7 +116,6 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha)
		rval = qla2x00_setup_chip(ha);
		if (rval)
			return (rval);
		qla2xxx_get_flash_info(ha);
	}
	if (IS_QLA84XX(ha)) {
		ha->cs84xx = qla84xx_get_chip(ha);
@@ -3751,7 +3757,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr)
	rval = QLA_SUCCESS;

	segments = FA_RISC_CODE_SEGMENTS;
	faddr = FA_RISC_CODE_ADDR;
	faddr = ha->flt_region_fw;
	dcode = (uint32_t *)ha->request_ring;
	*srisc_addr = 0;

Loading