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

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

[SCSI] lpfc 8.2.6 : PCI Parity and EEH handling fixes



PCI Parity and EEH handling Fixes:
- Under a PCI Data Parity Error, remove a completion routine callback that
  was on a command that we had already failed and released.
- Under PCI parity error, we were not reinstalling the interrupt handler
  in the slot_reset callback, so we never became functional again.

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 58da1ffb
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -2371,6 +2371,7 @@ static pci_ers_result_t lpfc_io_slot_reset(struct pci_dev *pdev)
	struct Scsi_Host *shost = pci_get_drvdata(pdev);
	struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
	struct lpfc_sli *psli = &phba->sli;
	int error, retval;

	dev_printk(KERN_INFO, &pdev->dev, "recovering from a slot reset.\n");
	if (pci_enable_device_mem(pdev)) {
@@ -2385,6 +2386,36 @@ static pci_ers_result_t lpfc_io_slot_reset(struct pci_dev *pdev)
	psli->sli_flag &= ~LPFC_SLI2_ACTIVE;
	spin_unlock_irq(&phba->hbalock);

	/* Enable configured interrupt method */
	phba->intr_type = NONE;
	if (phba->cfg_use_msi == 2) {
		error = lpfc_enable_msix(phba);
		if (!error)
			phba->intr_type = MSIX;
	}

	/* Fallback to MSI if MSI-X initialization failed */
	if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) {
		retval = pci_enable_msi(phba->pcidev);
		if (!retval)
			phba->intr_type = MSI;
		else
			lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
					"0470 Enable MSI failed, continuing "
					"with IRQ\n");
	}

	/* MSI-X is the only case the doesn't need to call request_irq */
	if (phba->intr_type != MSIX) {
		retval = request_irq(phba->pcidev->irq, lpfc_intr_handler,
				     IRQF_SHARED, LPFC_DRIVER_NAME, phba);
		if (retval) {
			lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
					"0471 Enable interrupt handler "
					"failed\n");
		} else if (phba->intr_type != MSI)
			phba->intr_type = INTx;
	}

	/* Take device offline; this will perform cleanup */
	lpfc_offline(phba);
+1 −2
Original line number Diff line number Diff line
@@ -3634,8 +3634,7 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
		 *  If the iocb is not found in Firmware queue the iocb
		 *  might have completed already. Do not free it again.
		 */
		if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
			(irsp->un.ulpWord[4] == IOERR_NO_XRI)) {
		if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
			spin_unlock_irq(&phba->hbalock);
			lpfc_sli_release_iocbq(phba, cmdiocb);
			return;