Commit 1ae47cf3 authored by Joe Carnuccio's avatar Joe Carnuccio Committed by James Bottomley

[SCSI] qla2xxx: Reconfigure thermal temperature.

For supported ISPS, Read asic temperature by calling the
GET PARAMS (type C) mailbox command.
Signed-off-by: default avatarJoe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: default avatarSaurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent c46e65c7
...@@ -1300,12 +1300,6 @@ qla2x00_thermal_temp_show(struct device *dev, ...@@ -1300,12 +1300,6 @@ qla2x00_thermal_temp_show(struct device *dev,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
uint16_t temp = 0; uint16_t temp = 0;
if (!vha->hw->thermal_support) {
ql_log(ql_log_warn, vha, 0x70db,
"Thermal not supported by this card.\n");
goto done;
}
if (qla2x00_reset_active(vha)) { if (qla2x00_reset_active(vha)) {
ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n"); ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n");
goto done; goto done;
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
* | Module Init and Probe | 0x0151 | 0x4b,0xba,0xfa | * | Module Init and Probe | 0x0151 | 0x4b,0xba,0xfa |
* | Mailbox commands | 0x1181 | 0x111a-0x111b | * | Mailbox commands | 0x1181 | 0x111a-0x111b |
* | | | 0x1155-0x1158 | * | | | 0x1155-0x1158 |
* | | | 0x1018-0x1019 |
* | | | 0x10ca |
* | Device Discovery | 0x2095 | 0x2020-0x2022, | * | Device Discovery | 0x2095 | 0x2020-0x2022, |
* | | | 0x2011-0x2012, | * | | | 0x2011-0x2012, |
* | | | 0x2016 | * | | | 0x2016 |
...@@ -37,7 +39,7 @@ ...@@ -37,7 +39,7 @@
* | | | 0x70a5,0x70a6, | * | | | 0x70a5,0x70a6, |
* | | | 0x70a8,0x70ab, | * | | | 0x70a8,0x70ab, |
* | | | 0x70ad-0x70ae, | * | | | 0x70ad-0x70ae, |
* | | | 0x70d1-0x70da, | * | | | 0x70d1-0x70db, |
* | | | 0x7047,0x703b | * | | | 0x7047,0x703b |
* | Task Management | 0x803d | 0x8025-0x8026 | * | Task Management | 0x803d | 0x8025-0x8026 |
* | | | 0x800b,0x8039 | * | | | 0x800b,0x8039 |
......
...@@ -3304,9 +3304,6 @@ struct qla_hw_data { ...@@ -3304,9 +3304,6 @@ struct qla_hw_data {
struct mr_data_fx00 mr; struct mr_data_fx00 mr;
struct qlt_hw_data tgt; struct qlt_hw_data tgt;
uint16_t thermal_support;
#define THERMAL_SUPPORT_I2C BIT_0
#define THERMAL_SUPPORT_ISP BIT_1
}; };
/* /*
......
...@@ -685,6 +685,8 @@ extern int qla81xx_get_led_config(scsi_qla_host_t *, uint16_t *); ...@@ -685,6 +685,8 @@ extern int qla81xx_get_led_config(scsi_qla_host_t *, uint16_t *);
extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int);
extern char *qdev_state(uint32_t); extern char *qdev_state(uint32_t);
extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *); extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *);
extern int qla82xx_read_temperature(scsi_qla_host_t *);
extern int qla8044_read_temperature(scsi_qla_host_t *);
/* BSG related functions */ /* BSG related functions */
extern int qla24xx_bsg_request(struct fc_bsg_job *); extern int qla24xx_bsg_request(struct fc_bsg_job *);
......
...@@ -524,7 +524,6 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha) ...@@ -524,7 +524,6 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
vha->flags.reset_active = 0; vha->flags.reset_active = 0;
ha->flags.pci_channel_io_perm_failure = 0; ha->flags.pci_channel_io_perm_failure = 0;
ha->flags.eeh_busy = 0; ha->flags.eeh_busy = 0;
ha->thermal_support = THERMAL_SUPPORT_I2C|THERMAL_SUPPORT_ISP;
atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
atomic_set(&vha->loop_state, LOOP_DOWN); atomic_set(&vha->loop_state, LOOP_DOWN);
vha->device_flags = DFLG_NO_CABLE; vha->device_flags = DFLG_NO_CABLE;
......
...@@ -4608,40 +4608,43 @@ qla2x00_get_thermal_temp(scsi_qla_host_t *vha, uint16_t *temp) ...@@ -4608,40 +4608,43 @@ qla2x00_get_thermal_temp(scsi_qla_host_t *vha, uint16_t *temp)
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
uint8_t byte; uint8_t byte;
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10ca, if (!IS_FWI2_CAPABLE(ha) || IS_QLA24XX_TYPE(ha) || IS_QLA81XX(ha)) {
"Entered %s.\n", __func__); ql_dbg(ql_dbg_mbx, vha, 0x1150,
"Thermal not supported by this card.\n");
if (ha->thermal_support & THERMAL_SUPPORT_I2C) { return rval;
rval = qla2x00_read_sfp(vha, 0, &byte,
0x98, 0x1, 1, BIT_13|BIT_12|BIT_0);
*temp = byte;
if (rval == QLA_SUCCESS)
goto done;
ql_log(ql_log_warn, vha, 0x10c9,
"Thermal not supported through I2C bus, trying alternate "
"method (ISP access).\n");
ha->thermal_support &= ~THERMAL_SUPPORT_I2C;
} }
if (ha->thermal_support & THERMAL_SUPPORT_ISP) { if (IS_QLA25XX(ha)) {
rval = qla2x00_read_asic_temperature(vha, temp); if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
if (rval == QLA_SUCCESS) ha->pdev->subsystem_device == 0x0175) {
goto done; rval = qla2x00_read_sfp(vha, 0, &byte,
0x98, 0x1, 1, BIT_13|BIT_0);
ql_log(ql_log_warn, vha, 0x1019, *temp = byte;
"Thermal not supported through ISP.\n"); return rval;
ha->thermal_support &= ~THERMAL_SUPPORT_ISP; }
if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
ha->pdev->subsystem_device == 0x338e) {
rval = qla2x00_read_sfp(vha, 0, &byte,
0x98, 0x1, 1, BIT_15|BIT_14|BIT_0);
*temp = byte;
return rval;
}
ql_dbg(ql_dbg_mbx, vha, 0x10c9,
"Thermal not supported by this card.\n");
return rval;
} }
ql_log(ql_log_warn, vha, 0x1150, if (IS_QLA82XX(ha)) {
"Thermal not supported by this card " *temp = qla82xx_read_temperature(vha);
"(ignoring further requests).\n"); rval = QLA_SUCCESS;
return rval; return rval;
} else if (IS_QLA8044(ha)) {
*temp = qla8044_read_temperature(vha);
rval = QLA_SUCCESS;
return rval;
}
done: rval = qla2x00_read_asic_temperature(vha, temp);
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1018,
"Done %s.\n", __func__);
return rval; return rval;
} }
......
...@@ -2062,7 +2062,6 @@ qlafx00_initialize_adapter(scsi_qla_host_t *vha) ...@@ -2062,7 +2062,6 @@ qlafx00_initialize_adapter(scsi_qla_host_t *vha)
vha->flags.reset_active = 0; vha->flags.reset_active = 0;
ha->flags.pci_channel_io_perm_failure = 0; ha->flags.pci_channel_io_perm_failure = 0;
ha->flags.eeh_busy = 0; ha->flags.eeh_busy = 0;
ha->thermal_support = 0;
atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
atomic_set(&vha->loop_state, LOOP_DOWN); atomic_set(&vha->loop_state, LOOP_DOWN);
vha->device_flags = DFLG_NO_CABLE; vha->device_flags = DFLG_NO_CABLE;
......
...@@ -3327,6 +3327,14 @@ static int qla82xx_check_temp(scsi_qla_host_t *vha) ...@@ -3327,6 +3327,14 @@ static int qla82xx_check_temp(scsi_qla_host_t *vha)
return 0; return 0;
} }
int qla82xx_read_temperature(scsi_qla_host_t *vha)
{
uint32_t temp;
temp = qla82xx_rd_32(vha->hw, CRB_TEMP_STATE);
return qla82xx_get_temp_val(temp);
}
void qla82xx_clear_pending_mbx(scsi_qla_host_t *vha) void qla82xx_clear_pending_mbx(scsi_qla_host_t *vha)
{ {
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
......
...@@ -1945,6 +1945,14 @@ qla8044_check_temp(struct scsi_qla_host *vha) ...@@ -1945,6 +1945,14 @@ qla8044_check_temp(struct scsi_qla_host *vha)
return 0; return 0;
} }
int qla8044_read_temperature(scsi_qla_host_t *vha)
{
uint32_t temp;
temp = qla8044_rd_direct(vha, QLA8044_CRB_TEMP_STATE_INDEX);
return qla82xx_get_temp_val(temp);
}
/** /**
* qla8044_check_fw_alive - Check firmware health * qla8044_check_fw_alive - Check firmware health
* @ha: Pointer to host adapter structure. * @ha: Pointer to host adapter structure.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment