* PATCH [12/18] qla2xxx: Extend firmware dump support
@ 2004-06-22 5:57 Andrew Vasquez
0 siblings, 0 replies; only message in thread
From: Andrew Vasquez @ 2004-06-22 5:57 UTC (permalink / raw)
To: SCSI Mailing List, James Bottomley
ChangeSet
1.1848 04/06/16 14:28:08 andrew.vasquez@apc.qlogic.com +7 -0
Add firmware dump support for ISPs with memory chips larger than
128KB (512/1024KB).
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
drivers/scsi/qla2xxx/qla_dbg.c | 18 ++++++++++++------
drivers/scsi/qla2xxx/qla_dbg.h | 6 ++++--
drivers/scsi/qla2xxx/qla_def.h | 1 +
drivers/scsi/qla2xxx/qla_gbl.h | 2 +-
drivers/scsi/qla2xxx/qla_init.c | 13 ++++++++-----
drivers/scsi/qla2xxx/qla_mbx.c | 8 ++++++--
drivers/scsi/qla2xxx/qla_os.c | 12 +++++++++---
7 files changed, 41 insertions(+), 19 deletions(-)
diff -Nru a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
--- a/drivers/scsi/qla2xxx/qla_dbg.c 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_dbg.c 2004-06-21 15:39:15 -07:00
@@ -40,9 +40,10 @@
uint16_t *dmp_reg;
unsigned long flags;
struct qla2300_fw_dump *fw;
+ uint32_t dump_size, data_ram_cnt;
reg = ha->iobase;
- risc_address = 0;
+ risc_address = data_ram_cnt = 0;
mb0 = mb2 = 0;
flags = 0;
@@ -57,13 +58,15 @@
}
/* Allocate (large) dump buffer. */
- ha->fw_dump_order = get_order(sizeof(struct qla2300_fw_dump));
+ dump_size = sizeof(struct qla2300_fw_dump);
+ dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
+ ha->fw_dump_order = get_order(dump_size);
ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC,
ha->fw_dump_order);
if (ha->fw_dump == NULL) {
qla_printk(KERN_WARNING, ha,
- "Unable to allocated memory for firmware dump (%d/%Zd).\n",
- ha->fw_dump_order, sizeof(struct qla2300_fw_dump));
+ "Unable to allocated memory for firmware dump (%d/%d).\n",
+ ha->fw_dump_order, dump_size);
goto qla2300_fw_dump_failed;
}
fw = ha->fw_dump;
@@ -304,10 +307,11 @@
if (rval == QLA_SUCCESS) {
/* Get data SRAM. */
risc_address = 0x11000;
+ data_ram_cnt = ha->fw_memory_size - risc_address + 1;
WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
}
- for (cnt = 0; cnt < sizeof(fw->data_ram) / 2 && rval == QLA_SUCCESS;
+ for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;
cnt++, risc_address++) {
WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
@@ -386,6 +390,7 @@
char *uiter;
char fw_info[30];
struct qla2300_fw_dump *fw;
+ uint32_t data_ram_cnt;
uiter = ha->fw_dump_buffer;
fw = ha->fw_dump;
@@ -550,7 +555,8 @@
}
qla_uprintf(&uiter, "\n\nData RAM Dump:");
- for (cnt = 0; cnt < sizeof (fw->data_ram) / 2; cnt++) {
+ data_ram_cnt = ha->fw_memory_size - 0x11000 + 1;
+ for (cnt = 0; cnt < data_ram_cnt; cnt++) {
if (cnt % 8 == 0) {
qla_uprintf(&uiter, "\n%05x: ", cnt + 0x11000);
}
diff -Nru a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
--- a/drivers/scsi/qla2xxx/qla_dbg.h 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_dbg.h 2004-06-21 15:39:15 -07:00
@@ -182,7 +182,9 @@
/*
* Firmware Dump structure definition
*/
-#define FW_DUMP_SIZE 0xBC000 /* bytes */
+#define FW_DUMP_SIZE_128K 0xBC000
+#define FW_DUMP_SIZE_512K 0x2FC000
+#define FW_DUMP_SIZE_1M 0x5FC000
struct qla2300_fw_dump {
uint16_t hccr;
@@ -205,7 +207,7 @@
uint16_t fpm_b1_reg[64];
uint16_t risc_ram[0xf800];
uint16_t stack_ram[0x1000];
- uint16_t data_ram[0xF000];
+ uint16_t data_ram[1];
};
struct qla2100_fw_dump {
diff -Nru a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
--- a/drivers/scsi/qla2xxx/qla_def.h 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_def.h 2004-06-21 15:39:15 -07:00
@@ -2303,6 +2303,7 @@
uint16_t fw_minor_version;
uint16_t fw_subminor_version;
uint16_t fw_attributes;
+ uint32_t fw_memory_size;
uint32_t fw_transfer_size;
uint16_t fw_options[16]; /* slots: 1,2,3,10,11 */
diff -Nru a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
--- a/drivers/scsi/qla2xxx/qla_gbl.h 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_gbl.h 2004-06-21 15:39:15 -07:00
@@ -139,7 +139,7 @@
extern void
qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *,
- uint16_t *, uint16_t *, uint16_t *);
+ uint16_t *, uint16_t *, uint16_t *, uint32_t *);
extern int
qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *);
diff -Nru a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
--- a/drivers/scsi/qla2xxx/qla_init.c 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_init.c 2004-06-21 15:39:15 -07:00
@@ -220,11 +220,6 @@
} while (restart_risc && retry--);
if (rval == QLA_SUCCESS) {
- /* Retrieve firmware information */
- qla2x00_get_fw_version(ha, &ha->fw_major_version,
- &ha->fw_minor_version, &ha->fw_subminor_version,
- &ha->fw_attributes);
-
clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
ha->marker_needed = 1;
qla2x00_marker(ha, 0, 0, MK_SYNC_ALL);
@@ -730,6 +725,14 @@
"firmware.\n", ha->host_no));
rval = qla2x00_execute_fw(ha);
+ /* Retrieve firmware information. */
+ if (rval == QLA_SUCCESS && ha->fw_major_version == 0) {
+ qla2x00_get_fw_version(ha,
+ &ha->fw_major_version,
+ &ha->fw_minor_version,
+ &ha->fw_subminor_version,
+ &ha->fw_attributes, &ha->fw_memory_size);
+ }
}
else {
DEBUG2(printk(KERN_INFO
diff -Nru a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
--- a/drivers/scsi/qla2xxx/qla_mbx.c 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_mbx.c 2004-06-21 15:39:15 -07:00
@@ -546,7 +546,7 @@
*/
void
qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, uint16_t *minor,
- uint16_t *subminor, uint16_t *attributes)
+ uint16_t *subminor, uint16_t *attributes, uint32_t *memory)
{
int rval;
mbx_cmd_t mc;
@@ -556,7 +556,7 @@
mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
mcp->out_mb = MBX_0;
- mcp->in_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
+ mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
mcp->flags = 0;
mcp->tov = 30;
rval = qla2x00_mailbox_command(ha, mcp);
@@ -566,6 +566,10 @@
*minor = mcp->mb[2];
*subminor = mcp->mb[3];
*attributes = mcp->mb[6];
+ if (IS_QLA2100(ha) || IS_QLA2200(ha))
+ *memory = 0x1FFFF; /* Defaults to 128KB. */
+ else
+ *memory = (mcp->mb[5] << 16) | mcp->mb[4];
if (rval != QLA_SUCCESS) {
/*EMPTY*/
diff -Nru a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
--- a/drivers/scsi/qla2xxx/qla_os.c 2004-06-21 15:39:15 -07:00
+++ b/drivers/scsi/qla2xxx/qla_os.c 2004-06-21 15:39:15 -07:00
@@ -455,6 +455,7 @@
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);
@@ -480,11 +481,16 @@
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);
@@ -492,7 +498,7 @@
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2004-06-22 5:53 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-22 5:57 PATCH [12/18] qla2xxx: Extend firmware dump support Andrew Vasquez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).