diff options
author | Lalit Chandivade <lalit.chandivade@qlogic.com> | 2009-03-26 08:49:17 -0700 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-04-03 09:22:49 -0500 |
commit | 6e181be508cf81fda4407b4689befeb7e4149607 (patch) | |
tree | 27765812d249113374e9fdf9267f3043811fcb2e /drivers/scsi/qla2xxx/qla_attr.c | |
parent | 2533cf671da0603129c8af9c31c735e1d2654e20 (diff) |
[SCSI] qla2xxx: Add reset capabilities for application support.
Signed-off-by: Lalit Chandivade <lalit.chandivade@qlogic.com>
Additional cleanups and
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_attr.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 117517dcbe44..1f1a7c0e88e7 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -479,6 +479,61 @@ static struct bin_attribute sysfs_sfp_attr = { .read = qla2x00_sysfs_read_sfp, }; +static ssize_t +qla2x00_sysfs_write_reset(struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, + struct device, kobj))); + struct qla_hw_data *ha = vha->hw; + int type; + + if (off != 0) + return 0; + + type = simple_strtol(buf, NULL, 10); + switch (type) { + case 0x2025c: + qla_printk(KERN_INFO, ha, + "Issuing ISP reset on (%ld).\n", vha->host_no); + + scsi_block_requests(vha->host); + set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); + qla2xxx_wake_dpc(vha); + qla2x00_wait_for_chip_reset(vha); + scsi_unblock_requests(vha->host); + break; + case 0x2025d: + if (!IS_QLA81XX(ha)) + break; + + qla_printk(KERN_INFO, ha, + "Issuing MPI reset on (%ld).\n", vha->host_no); + + /* Make sure FC side is not in reset */ + qla2x00_wait_for_hba_online(vha); + + /* Issue MPI reset */ + scsi_block_requests(vha->host); + if (qla81xx_restart_mpi_firmware(vha) != QLA_SUCCESS) + qla_printk(KERN_WARNING, ha, + "MPI reset failed on (%ld).\n", vha->host_no); + scsi_unblock_requests(vha->host); + break; + } + return count; +} + +static struct bin_attribute sysfs_reset_attr = { + .attr = { + .name = "reset", + .mode = S_IWUSR, + }, + .size = 0, + .write = qla2x00_sysfs_write_reset, +}; + static struct sysfs_entry { char *name; struct bin_attribute *attr; @@ -490,6 +545,7 @@ static struct sysfs_entry { { "optrom_ctl", &sysfs_optrom_ctl_attr, }, { "vpd", &sysfs_vpd_attr, 1 }, { "sfp", &sysfs_sfp_attr, 1 }, + { "reset", &sysfs_reset_attr, }, { NULL }, }; |