diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2006-05-17 18:09:50 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-05-20 10:50:11 -0400 |
commit | d4e3e04d789ba23027c66e176b10ac7477906948 (patch) | |
tree | e98c514c2b3505af6f0c0a2e48f697899735ff15 /drivers | |
parent | cb63067a772c0149184309a1f232d62c81a93673 (diff) |
[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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 12 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 53 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 27 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 7 |
5 files changed, 43 insertions, 62 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index fee0c493775b..e96d58ded57c 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -46,22 +46,16 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, char *buf, loff_t off, | |||
46 | case 0: | 46 | case 0: |
47 | if (ha->fw_dump_reading == 1) { | 47 | if (ha->fw_dump_reading == 1) { |
48 | qla_printk(KERN_INFO, ha, | 48 | qla_printk(KERN_INFO, ha, |
49 | "Firmware dump cleared on (%ld).\n", | 49 | "Firmware dump cleared on (%ld).\n", ha->host_no); |
50 | ha->host_no); | ||
51 | 50 | ||
52 | vfree(ha->fw_dump_buffer); | 51 | 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; | ||
58 | ha->fw_dump_buffer = NULL; | 52 | ha->fw_dump_buffer = NULL; |
59 | ha->fw_dump = NULL; | 53 | ha->fw_dump_reading = 0; |
60 | ha->fw_dumped = 0; | 54 | ha->fw_dumped = 0; |
61 | } | 55 | } |
62 | break; | 56 | break; |
63 | case 1: | 57 | case 1: |
64 | if ((ha->fw_dump || ha->fw_dumped) && !ha->fw_dump_reading) { | 58 | if (ha->fw_dumped && !ha->fw_dump_reading) { |
65 | ha->fw_dump_reading = 1; | 59 | ha->fw_dump_reading = 1; |
66 | 60 | ||
67 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) | 61 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index e8120fb7f88e..74e54713aa7c 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -28,7 +28,7 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
28 | uint16_t __iomem *dmp_reg; | 28 | uint16_t __iomem *dmp_reg; |
29 | unsigned long flags; | 29 | unsigned long flags; |
30 | struct qla2300_fw_dump *fw; | 30 | struct qla2300_fw_dump *fw; |
31 | uint32_t dump_size, data_ram_cnt; | 31 | uint32_t data_ram_cnt; |
32 | 32 | ||
33 | risc_address = data_ram_cnt = 0; | 33 | risc_address = data_ram_cnt = 0; |
34 | mb0 = mb2 = 0; | 34 | mb0 = mb2 = 0; |
@@ -37,23 +37,16 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
37 | if (!hardware_locked) | 37 | if (!hardware_locked) |
38 | spin_lock_irqsave(&ha->hardware_lock, flags); | 38 | spin_lock_irqsave(&ha->hardware_lock, flags); |
39 | 39 | ||
40 | if (ha->fw_dump != NULL) { | 40 | if (!ha->fw_dump) { |
41 | qla_printk(KERN_WARNING, ha, | 41 | qla_printk(KERN_WARNING, ha, |
42 | "Firmware has been previously dumped (%p) -- ignoring " | 42 | "No buffer available for dump!!!\n"); |
43 | "request...\n", ha->fw_dump); | ||
44 | goto qla2300_fw_dump_failed; | 43 | goto qla2300_fw_dump_failed; |
45 | } | 44 | } |
46 | 45 | ||
47 | /* Allocate (large) dump buffer. */ | 46 | if (ha->fw_dumped) { |
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) { | ||
54 | qla_printk(KERN_WARNING, ha, | 47 | qla_printk(KERN_WARNING, ha, |
55 | "Unable to allocated memory for firmware dump (%d/%d).\n", | 48 | "Firmware has been previously dumped (%p) -- ignoring " |
56 | ha->fw_dump_order, dump_size); | 49 | "request...\n", ha->fw_dump); |
57 | goto qla2300_fw_dump_failed; | 50 | goto qla2300_fw_dump_failed; |
58 | } | 51 | } |
59 | fw = ha->fw_dump; | 52 | fw = ha->fw_dump; |
@@ -358,17 +351,16 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
358 | } | 351 | } |
359 | } | 352 | } |
360 | 353 | ||
361 | |||
362 | if (rval != QLA_SUCCESS) { | 354 | if (rval != QLA_SUCCESS) { |
363 | qla_printk(KERN_WARNING, ha, | 355 | qla_printk(KERN_WARNING, ha, |
364 | "Failed to dump firmware (%x)!!!\n", rval); | 356 | "Failed to dump firmware (%x)!!!\n", rval); |
357 | ha->fw_dumped = 0; | ||
365 | 358 | ||
366 | free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order); | ||
367 | ha->fw_dump = NULL; | ||
368 | } else { | 359 | } else { |
369 | qla_printk(KERN_INFO, ha, | 360 | qla_printk(KERN_INFO, ha, |
370 | "Firmware dump saved to temp buffer (%ld/%p).\n", | 361 | "Firmware dump saved to temp buffer (%ld/%p).\n", |
371 | ha->host_no, ha->fw_dump); | 362 | ha->host_no, ha->fw_dump); |
363 | ha->fw_dumped = 1; | ||
372 | } | 364 | } |
373 | 365 | ||
374 | qla2300_fw_dump_failed: | 366 | qla2300_fw_dump_failed: |
@@ -587,21 +579,16 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
587 | if (!hardware_locked) | 579 | if (!hardware_locked) |
588 | spin_lock_irqsave(&ha->hardware_lock, flags); | 580 | spin_lock_irqsave(&ha->hardware_lock, flags); |
589 | 581 | ||
590 | if (ha->fw_dump != NULL) { | 582 | if (!ha->fw_dump) { |
591 | qla_printk(KERN_WARNING, ha, | 583 | qla_printk(KERN_WARNING, ha, |
592 | "Firmware has been previously dumped (%p) -- ignoring " | 584 | "No buffer available for dump!!!\n"); |
593 | "request...\n", ha->fw_dump); | ||
594 | extern | 585 | goto qla2100_fw_dump_fai int prtad, int devad, u16 addr, int mask, bool sense); extern int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmds); extern int mdio45_nway_restart(const struct mdio_if_info *mdio); extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, struct ethtool_cmd *ecmd, u32 npage_adv, u32 npage_lpa); extern void mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio, const struct ethtool_pauseparam *ecmd); /** * mdio45_ethtool_gset - get settings for ETHTOOL_GSET * @mdio: MDIO interface * @ecmd: Ethtool request structure * * Since the CSRs for auto-negotiation using next pages are not fully * standardised, this function does not attempt to decode them. Use * mdio45_ethtool_gset_npage() to specify advertisement bits from next * pages. */ static inline void mdio45_ethtool_gset(const struct mdio_if_info *mdio, struct ethtool_cmd *ecmd) { mdio45_ethtool_gset_npage(mdio, ecmd, 0, 0); } extern int mdio_mii_ioctl(const struct mdio_if_info *mdio, struct mii_ioctl_data *mii_data, int cmd); #endif /* __KERNEL__ */ #endif /* __LINUX_MDIO_H__ */ |