Skip to content

Commit d4e3e04

Browse files
avasquez01James Bottomley
authored andcommitted
[SCSI] qla2xxx: Consolidate firmware-dump handling across ISPs.
Simplify and centralise buffer allocation/deallocation, as there's no point in having two memory request methods. Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
1 parent cb63067 commit d4e3e04

File tree

5 files changed

+43
-62
lines changed

5 files changed

+43
-62
lines changed

drivers/scsi/qla2xxx/qla_attr.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,16 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off,
4646
case 0:
4747
if (ha->fw_dump_reading == 1) {
4848
qla_printk(KERN_INFO, ha,
49-
"Firmware dump cleared on (%ld).\n",
50-
ha->host_no);
49+
"Firmware dump cleared on (%ld).\n", ha->host_no);
5150

5251
vfree(ha->fw_dump_buffer);
53-
if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))
54-
free_pages((unsigned long)ha->fw_dump,
55-
ha->fw_dump_order);
56-
57-
ha->fw_dump_reading = 0;
5852
ha->fw_dump_buffer = NULL;
59-
ha->fw_dump = NULL;
53+
ha->fw_dump_reading = 0;
6054
ha->fw_dumped = 0;
6155
}
6256
break;
6357
case 1:
64-
if ((ha->fw_dump || ha->fw_dumped) && !ha->fw_dump_reading) {
58+
if (ha->fw_dumped && !ha->fw_dump_reading) {
6559
ha->fw_dump_reading = 1;
6660

6761
if (IS_QLA24XX(ha) || IS_QLA54XX(ha))

drivers/scsi/qla2xxx/qla_dbg.c

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
2828
uint16_t __iomem *dmp_reg;
2929
unsigned long flags;
3030
struct qla2300_fw_dump *fw;
31-
uint32_t dump_size, data_ram_cnt;
31+
uint32_t data_ram_cnt;
3232

3333
risc_address = data_ram_cnt = 0;
3434
mb0 = mb2 = 0;
@@ -37,23 +37,16 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
3737
if (!hardware_locked)
3838
spin_lock_irqsave(&ha->hardware_lock, flags);
3939

40-
if (ha->fw_dump != NULL) {
40+
if (!ha->fw_dump) {
4141
qla_printk(KERN_WARNING, ha,
42-
"Firmware has been previously dumped (%p) -- ignoring "
43-
"request...\n", ha->fw_dump);
42+
"No buffer available for dump!!!\n");
4443
goto qla2300_fw_dump_failed;
4544
}
4645

47-
/* Allocate (large) dump buffer. */
48-
dump_size = sizeof(struct qla2300_fw_dump);
49-
dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
50-
ha->fw_dump_order = get_order(dump_size);
51-
ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC,
52-
ha->fw_dump_order);
53-
if (ha->fw_dump == NULL) {
46+
if (ha->fw_dumped) {
5447
qla_printk(KERN_WARNING, ha,
55-
"Unable to allocated memory for firmware dump (%d/%d).\n",
56-
ha->fw_dump_order, dump_size);
48+
"Firmware has been previously dumped (%p) -- ignoring "
49+
"request...\n", ha->fw_dump);
5750
goto qla2300_fw_dump_failed;
5851
}
5952
fw = ha->fw_dump;
@@ -358,17 +351,16 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
358351
}
359352
}
360353

361-
362354
if (rval != QLA_SUCCESS) {
363355
qla_printk(KERN_WARNING, ha,
364356
"Failed to dump firmware (%x)!!!\n", rval);
357+
ha->fw_dumped = 0;
365358

366-
free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
367-
ha->fw_dump = NULL;
368359
} else {
369360
qla_printk(KERN_INFO, ha,
370361
"Firmware dump saved to temp buffer (%ld/%p).\n",
371362
ha->host_no, ha->fw_dump);
363+
ha->fw_dumped = 1;
372364
}
373365

374366
qla2300_fw_dump_failed:
@@ -587,21 +579,16 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
587579
if (!hardware_locked)
588580
spin_lock_irqsave(&ha->hardware_lock, flags);
589581

590-
if (ha->fw_dump != NULL) {
582+
if (!ha->fw_dump) {
591583
qla_printk(KERN_WARNING, ha,
592-
"Firmware has been previously dumped (%p) -- ignoring "
593-
"request...\n", ha->fw_dump);
584+
"No buffer available for dump!!!\n");
594585
goto qla2100_fw_dump_failed;
595586
}
596587

597-
/* Allocate (large) dump buffer. */
598-
ha->fw_dump_order = get_order(sizeof(struct qla2100_fw_dump));
599-
ha->fw_dump = (struct qla2100_fw_dump *) __get_free_pages(GFP_ATOMIC,
600-
ha->fw_dump_order);
601-
if (ha->fw_dump == NULL) {
588+
if (ha->fw_dumped) {
602589
qla_printk(KERN_WARNING, ha,
603-
"Unable to allocated memory for firmware dump (%d/%Zd).\n",
604-
ha->fw_dump_order, sizeof(struct qla2100_fw_dump));
590+
"Firmware has been previously dumped (%p) -- ignoring "
591+
"request...\n", ha->fw_dump);
605592
goto qla2100_fw_dump_failed;
606593
}
607594
fw = ha->fw_dump;
@@ -777,13 +764,13 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
777764
if (rval != QLA_SUCCESS) {
778765
qla_printk(KERN_WARNING, ha,
779766
"Failed to dump firmware (%x)!!!\n", rval);
767+
ha->fw_dumped = 0;
780768

781-
free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
782-
ha->fw_dump = NULL;
783769
} else {
784770
qla_printk(KERN_INFO, ha,
785771
"Firmware dump saved to temp buffer (%ld/%p).\n",
786772
ha->host_no, ha->fw_dump);
773+
ha->fw_dumped = 1;
787774
}
788775

789776
qla2100_fw_dump_failed:
@@ -988,7 +975,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
988975
if (!hardware_locked)
989976
spin_lock_irqsave(&ha->hardware_lock, flags);
990977

991-
if (!ha->fw_dump24) {
978+
if (!ha->fw_dump) {
992979
qla_printk(KERN_WARNING, ha,
993980
"No buffer available for dump!!!\n");
994981
goto qla24xx_fw_dump_failed;
@@ -997,10 +984,10 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
997984
if (ha->fw_dumped) {
998985
qla_printk(KERN_WARNING, ha,
999986
"Firmware has been previously dumped (%p) -- ignoring "
1000-
"request...\n", ha->fw_dump24);
987+
"request...\n", ha->fw_dump);
1001988
goto qla24xx_fw_dump_failed;
1002989
}
1003-
fw = (struct qla24xx_fw_dump *) ha->fw_dump24;
990+
fw = ha->fw_dump;
1004991

1005992
rval = QLA_SUCCESS;
1006993
fw->host_status = RD_REG_DWORD(&reg->host_status);
@@ -1654,7 +1641,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
16541641
} else {
16551642
qla_printk(KERN_INFO, ha,
16561643
"Firmware dump saved to temp buffer (%ld/%p).\n",
1657-
ha->host_no, ha->fw_dump24);
1644+
ha->host_no, ha->fw_dump);
16581645
ha->fw_dumped = 1;
16591646
}
16601647

@@ -1672,7 +1659,7 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha)
16721659
uint32_t ext_mem_cnt;
16731660

16741661
uiter = ha->fw_dump_buffer;
1675-
fw = ha->fw_dump24;
1662+
fw = ha->fw_dump;
16761663

16771664
qla_uprintf(&uiter, "ISP FW Version %d.%02d.%02d Attributes %04x\n",
16781665
ha->fw_major_version, ha->fw_minor_version,

drivers/scsi/qla2xxx/qla_def.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,15 +2304,11 @@ typedef struct scsi_qla_host {
23042304

23052305
/* Firmware dump information. */
23062306
void *fw_dump;
2307-
int fw_dump_order;
2307+
int fw_dumped;
23082308
int fw_dump_reading;
23092309
char *fw_dump_buffer;
23102310
int fw_dump_buffer_len;
23112311

2312-
int fw_dumped;
2313-
void *fw_dump24;
2314-
int fw_dump24_len;
2315-
23162312
uint8_t host_str[16];
23172313
uint32_t pci_attr;
23182314

drivers/scsi/qla2xxx/qla_init.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -773,16 +773,26 @@ qla24xx_chip_diag(scsi_qla_host_t *ha)
773773
static void
774774
qla2x00_alloc_fw_dump(scsi_qla_host_t *ha)
775775
{
776+
uint32_t dump_size = 0;
777+
776778
ha->fw_dumped = 0;
777-
ha->fw_dump24_len = sizeof(struct qla24xx_fw_dump);
778-
ha->fw_dump24_len += (ha->fw_memory_size - 0x100000) * sizeof(uint32_t);
779-
ha->fw_dump24 = vmalloc(ha->fw_dump24_len);
780-
if (ha->fw_dump24)
779+
if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
780+
dump_size = sizeof(struct qla2100_fw_dump);
781+
} else if (IS_QLA23XX(ha)) {
782+
dump_size = sizeof(struct qla2300_fw_dump);
783+
dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
784+
} else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
785+
dump_size = sizeof(struct qla24xx_fw_dump);
786+
dump_size += (ha->fw_memory_size - 0x100000) * sizeof(uint32_t);
787+
}
788+
789+
ha->fw_dump = vmalloc(dump_size);
790+
if (ha->fw_dump)
781791
qla_printk(KERN_INFO, ha, "Allocated (%d KB) for firmware "
782-
"dump...\n", ha->fw_dump24_len / 1024);
792+
"dump...\n", dump_size / 1024);
783793
else
784794
qla_printk(KERN_WARNING, ha, "Unable to allocate (%d KB) for "
785-
"firmware dump!!!\n", ha->fw_dump24_len / 1024);
795+
"firmware dump!!!\n", dump_size / 1024);
786796
}
787797

788798
/**
@@ -800,13 +810,12 @@ qla2x00_resize_request_q(scsi_qla_host_t *ha)
800810
dma_addr_t request_dma;
801811
request_t *request_ring;
802812

813+
qla2x00_alloc_fw_dump(ha);
814+
803815
/* Valid only on recent ISPs. */
804816
if (IS_QLA2100(ha) || IS_QLA2200(ha))
805817
return;
806818

807-
if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
808-
qla2x00_alloc_fw_dump(ha);
809-
810819
/* Retrieve IOCB counts available to the firmware. */
811820
rval = qla2x00_get_resource_cnts(ha, NULL, NULL, NULL, &fw_iocb_cnt);
812821
if (rval)

drivers/scsi/qla2xxx/qla_os.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2068,15 +2068,10 @@ qla2x00_mem_free(scsi_qla_host_t *ha)
20682068
}
20692069
INIT_LIST_HEAD(&ha->fcports);
20702070

2071-
if (ha->fw_dump)
2072-
free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
2073-
2074-
vfree(ha->fw_dump24);
2075-
2071+
vfree(ha->fw_dump);
20762072
vfree(ha->fw_dump_buffer);
20772073

20782074
ha->fw_dump = NULL;
2079-
ha->fw_dump24 = NULL;
20802075
ha->fw_dumped = 0;
20812076
ha->fw_dump_reading = 0;
20822077
ha->fw_dump_buffer = NULL;

0 commit comments

Comments
 (0)