Commit f3d0a8ac authored by James Smart's avatar James Smart Committed by Martin K. Petersen

scsi: lpfc: Fix missing check for CSF in Write Object Mbox Rsp

When the WriteObject mailbox response has change_status set to is 0x2
(Firmware Reset) or 0x04 (Port Migration Reset), the CSF field should also
be checked to see if a fw reset is sufficient to enable all new features in
the updated firmware image. If not, a fw reset would start the new
firmware, but with a feature level equal to existing firmware.  To enable
the new features, a chip reset/pci slot reset would be required.

Check the CSF bit when change_status is 0x2 or 0x4 to know whether to
perform a pci bus reset or fw reset.

Link: https://lore.kernel.org/r/20191218235808.31922-4-jsmart2021@gmail.comSigned-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent df9166bf
...@@ -3925,6 +3925,9 @@ struct lpfc_mbx_wr_object { ...@@ -3925,6 +3925,9 @@ struct lpfc_mbx_wr_object {
#define LPFC_CHANGE_STATUS_FW_RESET 0x02 #define LPFC_CHANGE_STATUS_FW_RESET 0x02
#define LPFC_CHANGE_STATUS_PORT_MIGRATION 0x04 #define LPFC_CHANGE_STATUS_PORT_MIGRATION 0x04
#define LPFC_CHANGE_STATUS_PCI_RESET 0x05 #define LPFC_CHANGE_STATUS_PCI_RESET 0x05
#define lpfc_wr_object_csf_SHIFT 8
#define lpfc_wr_object_csf_MASK 0x00000001
#define lpfc_wr_object_csf_WORD word5
} response; } response;
} u; } u;
}; };
......
...@@ -19449,7 +19449,7 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list, ...@@ -19449,7 +19449,7 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
struct lpfc_mbx_wr_object *wr_object; struct lpfc_mbx_wr_object *wr_object;
LPFC_MBOXQ_t *mbox; LPFC_MBOXQ_t *mbox;
int rc = 0, i = 0; int rc = 0, i = 0;
uint32_t shdr_status, shdr_add_status, shdr_change_status; uint32_t shdr_status, shdr_add_status, shdr_change_status, shdr_csf;
uint32_t mbox_tmo; uint32_t mbox_tmo;
struct lpfc_dmabuf *dmabuf; struct lpfc_dmabuf *dmabuf;
uint32_t written = 0; uint32_t written = 0;
...@@ -19506,6 +19506,16 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list, ...@@ -19506,6 +19506,16 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
if (check_change_status) { if (check_change_status) {
shdr_change_status = bf_get(lpfc_wr_object_change_status, shdr_change_status = bf_get(lpfc_wr_object_change_status,
&wr_object->u.response); &wr_object->u.response);
if (shdr_change_status == LPFC_CHANGE_STATUS_FW_RESET ||
shdr_change_status == LPFC_CHANGE_STATUS_PORT_MIGRATION) {
shdr_csf = bf_get(lpfc_wr_object_csf,
&wr_object->u.response);
if (shdr_csf)
shdr_change_status =
LPFC_CHANGE_STATUS_PCI_RESET;
}
switch (shdr_change_status) { switch (shdr_change_status) {
case (LPFC_CHANGE_STATUS_PHYS_DEV_RESET): case (LPFC_CHANGE_STATUS_PHYS_DEV_RESET):
lpfc_printf_log(phba, KERN_INFO, LOG_INIT, lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
......
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