mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 22:58:29 +00:00
[SCSI] lpfc 8.1.7 : Fix failing firmware download due to mailbox delays needing to be longer
Fix failing firmware download due to mailbox delays needing to be longer. Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
64ba881829
commit
a309a6b6e6
5 changed files with 32 additions and 5 deletions
|
@ -1000,7 +1000,8 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
|
||||||
spin_unlock_irq(phba->host->host_lock);
|
spin_unlock_irq(phba->host->host_lock);
|
||||||
rc = lpfc_sli_issue_mbox_wait (phba,
|
rc = lpfc_sli_issue_mbox_wait (phba,
|
||||||
phba->sysfs_mbox.mbox,
|
phba->sysfs_mbox.mbox,
|
||||||
phba->fc_ratov * 2);
|
lpfc_mbox_tmo_val(phba,
|
||||||
|
phba->sysfs_mbox.mbox->mb.mbxCommand) * HZ);
|
||||||
spin_lock_irq(phba->host->host_lock);
|
spin_lock_irq(phba->host->host_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,7 @@ void lpfc_config_port(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
||||||
void lpfc_kill_board(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
void lpfc_kill_board(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
||||||
void lpfc_mbox_put(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
void lpfc_mbox_put(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
||||||
LPFC_MBOXQ_t *lpfc_mbox_get(struct lpfc_hba *);
|
LPFC_MBOXQ_t *lpfc_mbox_get(struct lpfc_hba *);
|
||||||
|
int lpfc_mbox_tmo_val(struct lpfc_hba *, int);
|
||||||
|
|
||||||
int lpfc_mem_alloc(struct lpfc_hba *);
|
int lpfc_mem_alloc(struct lpfc_hba *);
|
||||||
void lpfc_mem_free(struct lpfc_hba *);
|
void lpfc_mem_free(struct lpfc_hba *);
|
||||||
|
|
|
@ -651,3 +651,19 @@ lpfc_mbox_get(struct lpfc_hba * phba)
|
||||||
|
|
||||||
return mbq;
|
return mbq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
lpfc_mbox_tmo_val(struct lpfc_hba *phba, int cmd)
|
||||||
|
{
|
||||||
|
switch (cmd) {
|
||||||
|
case MBX_WRITE_NV: /* 0x03 */
|
||||||
|
case MBX_UPDATE_CFG: /* 0x1B */
|
||||||
|
case MBX_DOWN_LOAD: /* 0x1C */
|
||||||
|
case MBX_DEL_LD_ENTRY: /* 0x1D */
|
||||||
|
case MBX_LOAD_AREA: /* 0x81 */
|
||||||
|
case MBX_FLASH_WR_ULA: /* 0x98 */
|
||||||
|
case MBX_LOAD_EXP_ROM: /* 0x9C */
|
||||||
|
return LPFC_MBOX_TMO_FLASH_CMD;
|
||||||
|
}
|
||||||
|
return LPFC_MBOX_TMO;
|
||||||
|
}
|
||||||
|
|
|
@ -2197,7 +2197,8 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag)
|
||||||
return (MBX_NOT_FINISHED);
|
return (MBX_NOT_FINISHED);
|
||||||
}
|
}
|
||||||
/* timeout active mbox command */
|
/* timeout active mbox command */
|
||||||
mod_timer(&psli->mbox_tmo, jiffies + HZ * LPFC_MBOX_TMO);
|
mod_timer(&psli->mbox_tmo, (jiffies +
|
||||||
|
(HZ * lpfc_mbox_tmo_val(phba, mb->mbxCommand))));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mailbox cmd <cmd> issue */
|
/* Mailbox cmd <cmd> issue */
|
||||||
|
@ -2257,7 +2258,6 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MBX_POLL:
|
case MBX_POLL:
|
||||||
i = 0;
|
|
||||||
psli->mbox_active = NULL;
|
psli->mbox_active = NULL;
|
||||||
if (psli->sli_flag & LPFC_SLI2_ACTIVE) {
|
if (psli->sli_flag & LPFC_SLI2_ACTIVE) {
|
||||||
/* First read mbox status word */
|
/* First read mbox status word */
|
||||||
|
@ -2271,11 +2271,14 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag)
|
||||||
/* Read the HBA Host Attention Register */
|
/* Read the HBA Host Attention Register */
|
||||||
ha_copy = readl(phba->HAregaddr);
|
ha_copy = readl(phba->HAregaddr);
|
||||||
|
|
||||||
|
i = lpfc_mbox_tmo_val(phba, mb->mbxCommand);
|
||||||
|
i *= 1000; /* Convert to ms */
|
||||||
|
|
||||||
/* Wait for command to complete */
|
/* Wait for command to complete */
|
||||||
while (((word0 & OWN_CHIP) == OWN_CHIP) ||
|
while (((word0 & OWN_CHIP) == OWN_CHIP) ||
|
||||||
(!(ha_copy & HA_MBATT) &&
|
(!(ha_copy & HA_MBATT) &&
|
||||||
(phba->hba_state > LPFC_WARM_START))) {
|
(phba->hba_state > LPFC_WARM_START))) {
|
||||||
if (i++ >= 100) {
|
if (i-- <= 0) {
|
||||||
psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
|
psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
|
||||||
spin_unlock_irqrestore(phba->host->host_lock,
|
spin_unlock_irqrestore(phba->host->host_lock,
|
||||||
drvr_flag);
|
drvr_flag);
|
||||||
|
@ -2293,7 +2296,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag)
|
||||||
|
|
||||||
/* Can be in interrupt context, do not sleep */
|
/* Can be in interrupt context, do not sleep */
|
||||||
/* (or might be called with interrupts disabled) */
|
/* (or might be called with interrupts disabled) */
|
||||||
mdelay(i);
|
mdelay(1);
|
||||||
|
|
||||||
spin_lock_irqsave(phba->host->host_lock, drvr_flag);
|
spin_lock_irqsave(phba->host->host_lock, drvr_flag);
|
||||||
|
|
||||||
|
|
|
@ -225,3 +225,9 @@ struct lpfc_sli {
|
||||||
|
|
||||||
#define LPFC_MBOX_TMO 30 /* Sec tmo for outstanding mbox
|
#define LPFC_MBOX_TMO 30 /* Sec tmo for outstanding mbox
|
||||||
command */
|
command */
|
||||||
|
#define LPFC_MBOX_TMO_FLASH_CMD 300 /* Sec tmo for outstanding FLASH write
|
||||||
|
* or erase cmds. This is especially
|
||||||
|
* long because of the potential of
|
||||||
|
* multiple flash erases that can be
|
||||||
|
* spawned.
|
||||||
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue