lpfc 8.1.7 : Fix failing firmware download due to mailbox delays needing to be longer
Subsystems (2)
PATCH 2/6 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.
drivers/scsi/lpfc/lpfc_attr.c +2 -1
@@ -1000,7 +1000,8 @@ sysfs_mbox_read(struct kobject *kobj, chspin_unlock_irq (phba->host->host_lock); rc =lpfc_sli_issue_mbox_wait (phba, 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); }
drivers/scsi/lpfc/lpfc_crtn.h +1 -0
@@ -127,6 +127,7 @@ void lpfc_config_port(struct lpfc_hba *,void lpfc_kill_board (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 *); +int lpfc_mbox_tmo_val (struct lpfc_hba *,int );int lpfc_mem_alloc (struct lpfc_hba *);void lpfc_mem_free (struct lpfc_hba *);
drivers/scsi/lpfc/lpfc_mbox.c +16 -0
@@ -651,3 +651,19 @@ lpfc_mbox_get(struct lpfc_hba * phba)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 ; +}
drivers/scsi/lpfc/lpfc_sli.c +7 -4
@@ -2197,7 +2197,8 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phreturn (MBX_NOT_FINISHED ); }/* 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 */
@@ -2257,7 +2258,6 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phbreak ;case MBX_POLL : - i =0 ; psli->mbox_active =NULL ;if (psli->sli_flag &LPFC_SLI2_ACTIVE ) {/* First read mbox status word */
@@ -2271,11 +2271,14 @@ lpfc_sli_issue_mbox(struct lpfc_hba * ph/* Read the HBA Host Attention Register */ ha_copy =readl (phba->HAregaddr); + i =lpfc_mbox_tmo_val (phba, mb->mbxCommand); + i *=1000 ;/* Convert to ms */ +/* Wait for command to complete */ while (((word0 &OWN_CHIP ) ==OWN_CHIP ) || (!(ha_copy &HA_MBATT ) && (phba->hba_state >LPFC_WARM_START ))) { -if (i++ >=100 ) { +if (i-- <=0 ) { psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE ;spin_unlock_irqrestore (phba->host->host_lock, drvr_flag);
@@ -2293,7 +2296,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba * ph/* Can be in interrupt context, do not sleep */ /* (or might be called with interrupts disabled) */ -mdelay (i); +mdelay (1 );spin_lock_irqsave (phba->host->host_lock, drvr_flag);
drivers/scsi/lpfc/lpfc_sli.h +6 -0
@@ -225,3 +225,9 @@ struct lpfc_sli {#define LPFC_MBOX_TMO 30/* Sec tmo for outstanding mbox 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. +*/
drivers/scsi/lpfc/lpfc_sli.c lpfc_sli_issue_mbox(struct lpfc_hba * ph · line 2202
Quoted 7 lines · James Smart
Fix failing firmware download due to mailbox delays needing to be longer.
drivers/scsi/lpfc/lpfc_sli.c +2
-1/* 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)))); }
In linux/jiffies.h there are some functions for converting jiffies to *secs and back which you might find useful.
Eike
Quoted 10 lines · Rolf Eike Beer
drivers/scsi/lpfc/lpfc_sli.c lpfc_sli_issue_mbox(struct lpfc_hba * ph · line 2202
Quoted 7 lines · James Smart
Fix failing firmware download due to mailbox delays needing to be longer.
drivers/scsi/lpfc/lpfc_sli.c +2
-1/* 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)))); }In
linux/jiffies.hthere are some functions for converting jiffies to *secs and back which you might find useful.
Ok - but we're not really converting jiffies to seconds here...
-- james