Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-block.git] / drivers / scsi / qla2xxx / qla_attr.c
index c8731568f9c477788b7cc0507730c0ae4ec4b7dd..4888b999e82fb3e4885dea290a921155599dd17b 100644 (file)
@@ -518,6 +518,9 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj,
        if (unlikely(pci_channel_offline(ha->pdev)))
                return 0;
 
+       if (qla2x00_chip_is_down(vha))
+               return 0;
+
        if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size ||
            !ha->isp_ops->write_nvram)
                return 0;
@@ -570,7 +573,7 @@ qla2x00_sysfs_read_sfp(struct file *filp, struct kobject *kobj,
        if (!capable(CAP_SYS_ADMIN) || off != 0 || count < SFP_DEV_SIZE)
                return 0;
 
-       if (qla2x00_reset_active(vha))
+       if (qla2x00_chip_is_down(vha))
                return 0;
 
        rval = qla2x00_read_sfp_dev(vha, buf, count);
@@ -733,6 +736,15 @@ qla2x00_issue_logo(struct file *filp, struct kobject *kobj,
        int type;
        port_id_t did;
 
+       if (!capable(CAP_SYS_ADMIN))
+               return 0;
+
+       if (unlikely(pci_channel_offline(vha->hw->pdev)))
+               return 0;
+
+       if (qla2x00_chip_is_down(vha))
+               return 0;
+
        type = simple_strtol(buf, NULL, 10);
 
        did.b.domain = (type & 0x00ff0000) >> 16;
@@ -771,6 +783,12 @@ qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj,
        if (!capable(CAP_SYS_ADMIN) || off != 0 || count > XGMAC_DATA_SIZE)
                return 0;
 
+       if (unlikely(pci_channel_offline(ha->pdev)))
+               return 0;
+
+       if (qla2x00_chip_is_down(vha))
+               return 0;
+
        if (ha->xgmac_data)
                goto do_read;
 
@@ -825,6 +843,9 @@ qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj,
        if (ha->dcbx_tlv)
                goto do_read;
 
+       if (qla2x00_chip_is_down(vha))
+               return 0;
+
        ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE,
            &ha->dcbx_tlv_dma, GFP_KERNEL);
        if (!ha->dcbx_tlv) {
@@ -1036,7 +1057,7 @@ qla2x00_link_state_show(struct device *dev, struct device_attribute *attr,
            vha->device_flags & DFLG_NO_CABLE)
                len = scnprintf(buf, PAGE_SIZE, "Link Down\n");
        else if (atomic_read(&vha->loop_state) != LOOP_READY ||
-           qla2x00_reset_active(vha))
+           qla2x00_chip_is_down(vha))
                len = scnprintf(buf, PAGE_SIZE, "Unknown Link State\n");
        else {
                len = scnprintf(buf, PAGE_SIZE, "Link Up - ");
@@ -1163,7 +1184,7 @@ qla2x00_beacon_store(struct device *dev, struct device_attribute *attr,
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                return -EPERM;
 
-       if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) {
+       if (qla2x00_chip_is_down(vha)) {
                ql_log(ql_log_warn, vha, 0x707a,
                    "Abort ISP active -- ignoring beacon request.\n");
                return -EBUSY;
@@ -1350,7 +1371,7 @@ qla2x00_thermal_temp_show(struct device *dev,
        scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
        uint16_t temp = 0;
 
-       if (qla2x00_reset_active(vha)) {
+       if (qla2x00_chip_is_down(vha)) {
                ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n");
                goto done;
        }
@@ -1381,7 +1402,7 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr,
                return scnprintf(buf, PAGE_SIZE, "0x%x\n", pstate);
        }
 
-       if (qla2x00_reset_active(vha))
+       if (qla2x00_chip_is_down(vha))
                ql_log(ql_log_warn, vha, 0x707c,
                    "ISP reset active.\n");
        else if (!vha->hw->flags.eeh_busy)
@@ -1840,7 +1861,7 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
        if (unlikely(pci_channel_offline(ha->pdev)))
                goto done;
 
-       if (qla2x00_reset_active(vha))
+       if (qla2x00_chip_is_down(vha))
                goto done;
 
        stats = dma_zalloc_coherent(&ha->pdev->dev, sizeof(*stats),