[SCSI] lpfc 8.2.3 : Temperature handling fix

Temperature handling fix - return proper error code indicator for applications

Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
James Smart 2007-10-27 13:38:11 -04:00 коммит произвёл James Bottomley
Родитель 76bb24efdc
Коммит 7af670510d
3 изменённых файлов: 30 добавлений и 0 удалений

Просмотреть файл

@ -386,6 +386,11 @@ struct hbq_s {
#define LPFC_ELS_HBQ 0 #define LPFC_ELS_HBQ 0
#define LPFC_EXTRA_HBQ 1 #define LPFC_EXTRA_HBQ 1
enum hba_temp_state {
HBA_NORMAL_TEMP,
HBA_OVER_TEMP
};
struct lpfc_hba { struct lpfc_hba {
struct lpfc_sli sli; struct lpfc_sli sli;
uint32_t sli_rev; /* SLI2 or SLI3 */ uint32_t sli_rev; /* SLI2 or SLI3 */
@ -589,6 +594,7 @@ struct lpfc_hba {
*/ */
#define QUE_BUFTAG_BIT (1<<31) #define QUE_BUFTAG_BIT (1<<31)
uint32_t buffer_tag_count; uint32_t buffer_tag_count;
enum hba_temp_state over_temp_state;
}; };
static inline struct Scsi_Host * static inline struct Scsi_Host *

Просмотреть файл

@ -979,6 +979,12 @@ lpfc_soft_wwpn_store(struct class_device *cdev, const char *buf, size_t count)
unsigned int i, j, cnt=count; unsigned int i, j, cnt=count;
u8 wwpn[8]; u8 wwpn[8];
spin_lock_irq(&phba->hbalock);
if (phba->over_temp_state == HBA_OVER_TEMP) {
spin_unlock_irq(&phba->hbalock);
return -EPERM;
}
spin_unlock_irq(&phba->hbalock);
/* count may include a LF at end of string */ /* count may include a LF at end of string */
if (buf[cnt-1] == '\n') if (buf[cnt-1] == '\n')
cnt--; cnt--;
@ -1750,6 +1756,12 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr,
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->hbalock);
if (phba->over_temp_state == HBA_OVER_TEMP) {
sysfs_mbox_idle(phba);
spin_unlock_irq(&phba->hbalock);
return -EPERM;
}
if (off == 0 && if (off == 0 &&
phba->sysfs_mbox.state == SMBOX_WRITING && phba->sysfs_mbox.state == SMBOX_WRITING &&
phba->sysfs_mbox.offset >= 2 * sizeof(uint32_t)) { phba->sysfs_mbox.offset >= 2 * sizeof(uint32_t)) {

Просмотреть файл

@ -246,6 +246,15 @@ lpfc_config_port_post(struct lpfc_hba *phba)
int i, j; int i, j;
int rc; int rc;
spin_lock_irq(&phba->hbalock);
/*
* If the Config port completed correctly the HBA is not
* over heated any more.
*/
if (phba->over_temp_state == HBA_OVER_TEMP)
phba->over_temp_state = HBA_NORMAL_TEMP;
spin_unlock_irq(&phba->hbalock);
pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
if (!pmb) { if (!pmb) {
phba->link_state = LPFC_HBA_ERROR; phba->link_state = LPFC_HBA_ERROR;
@ -703,7 +712,10 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
SCSI_NL_VID_TYPE_PCI SCSI_NL_VID_TYPE_PCI
| PCI_VENDOR_ID_EMULEX); | PCI_VENDOR_ID_EMULEX);
spin_lock_irq(&phba->hbalock);
psli->sli_flag &= ~LPFC_SLI2_ACTIVE; psli->sli_flag &= ~LPFC_SLI2_ACTIVE;
phba->over_temp_state = HBA_OVER_TEMP;
spin_unlock_irq(&phba->hbalock);
lpfc_offline_prep(phba); lpfc_offline_prep(phba);
lpfc_offline(phba); lpfc_offline(phba);
lpfc_unblock_mgmt_io(phba); lpfc_unblock_mgmt_io(phba);