[SCSI] qla2xxx: Check loop-state before reading host statistics.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Mon, 29 Jan 2007 18:22:25 +0000 (10:22 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Wed, 31 Jan 2007 17:13:07 +0000 (11:13 -0600)
Non-ISP24xx cards must have a loop-id in order to query host
statistics.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/qla2xxx/qla_attr.c

index 78a5867..834c404 100644 (file)
@@ -885,21 +885,24 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
        link_stat_t stat_buf;
        struct fc_host_statistics *pfc_host_stat;
 
+       rval = QLA_FUNCTION_FAILED;
        pfc_host_stat = &ha->fc_host_stat;
        memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics));
 
        if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
                rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf,
                    sizeof(stat_buf) / 4, mb_stat);
-       } else {
+       } else if (atomic_read(&ha->loop_state) == LOOP_READY &&
+                   !test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) &&
+                   !test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) &&
+                   !ha->dpc_active) {
+               /* Must be in a 'READY' state for statistics retrieval. */
                rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf,
                    mb_stat);
        }
-       if (rval != 0) {
-               qla_printk(KERN_WARNING, ha,
-                   "Unable to retrieve host statistics (%d).\n", mb_stat[0]);
-               return pfc_host_stat;
-       }
+
+       if (rval != QLA_SUCCESS)
+               goto done;
 
        pfc_host_stat->link_failure_count = stat_buf.link_fail_cnt;
        pfc_host_stat->loss_of_sync_count = stat_buf.loss_sync_cnt;
@@ -907,7 +910,7 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
        pfc_host_stat->prim_seq_protocol_err_count = stat_buf.prim_seq_err_cnt;
        pfc_host_stat->invalid_tx_word_count = stat_buf.inval_xmit_word_cnt;
        pfc_host_stat->invalid_crc_count = stat_buf.inval_crc_cnt;
-
+done:
        return pfc_host_stat;
 }