Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a309a6b6 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[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: default avatarJames Smart <James.Smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 64ba8818
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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);
		}
		}


+1 −0
Original line number Original line Diff line number Diff line
@@ -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 *);
+16 −0
Original line number Original line Diff line number Diff line
@@ -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;
}
+7 −4
Original line number Original line Diff line number Diff line
@@ -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);


+6 −0
Original line number Original line Diff line number Diff line
@@ -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.
					 */