[SCSI] lpfc 8.3.22: Add support for PCI Adapter Failure
Periodically poll adapter registers to detect pci adapter failure (reads return -1). On failure, take port offline, set error indicators and wake up worker threads. Threads will take adapter offline. Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com> Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:

committed by
James Bottomley

parent
7f86059ac0
commit
9940b97bb3
@@ -348,7 +348,10 @@ lpfc_bsg_send_mgmt_cmd(struct fc_bsg_job *job)
|
||||
dd_data->context_un.iocb.bmp = bmp;
|
||||
|
||||
if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
|
||||
creg_val = readl(phba->HCregaddr);
|
||||
if (lpfc_readl(phba->HCregaddr, &creg_val)) {
|
||||
rc = -EIO ;
|
||||
goto free_cmdiocbq;
|
||||
}
|
||||
creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
|
||||
writel(creg_val, phba->HCregaddr);
|
||||
readl(phba->HCregaddr); /* flush */
|
||||
@@ -599,7 +602,10 @@ lpfc_bsg_rport_els(struct fc_bsg_job *job)
|
||||
dd_data->context_un.iocb.ndlp = ndlp;
|
||||
|
||||
if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
|
||||
creg_val = readl(phba->HCregaddr);
|
||||
if (lpfc_readl(phba->HCregaddr, &creg_val)) {
|
||||
rc = -EIO;
|
||||
goto linkdown_err;
|
||||
}
|
||||
creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
|
||||
writel(creg_val, phba->HCregaddr);
|
||||
readl(phba->HCregaddr); /* flush */
|
||||
@@ -613,6 +619,7 @@ lpfc_bsg_rport_els(struct fc_bsg_job *job)
|
||||
else
|
||||
rc = -EIO;
|
||||
|
||||
linkdown_err:
|
||||
pci_unmap_sg(phba->pcidev, job->request_payload.sg_list,
|
||||
job->request_payload.sg_cnt, DMA_TO_DEVICE);
|
||||
pci_unmap_sg(phba->pcidev, job->reply_payload.sg_list,
|
||||
@@ -1357,7 +1364,10 @@ lpfc_issue_ct_rsp(struct lpfc_hba *phba, struct fc_bsg_job *job, uint32_t tag,
|
||||
dd_data->context_un.iocb.ndlp = ndlp;
|
||||
|
||||
if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
|
||||
creg_val = readl(phba->HCregaddr);
|
||||
if (lpfc_readl(phba->HCregaddr, &creg_val)) {
|
||||
rc = -IOCB_ERROR;
|
||||
goto issue_ct_rsp_exit;
|
||||
}
|
||||
creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
|
||||
writel(creg_val, phba->HCregaddr);
|
||||
readl(phba->HCregaddr); /* flush */
|
||||
|
Reference in New Issue
Block a user