diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/scsi/lpfc/lpfc_attr.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_attr.c')
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 102 | 
1 files changed, 33 insertions, 69 deletions
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 22f2e046e8eb..3863a5341782 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c @@ -1644,6 +1644,12 @@ lpfc_sli4_pdev_status_reg_wait(struct lpfc_hba *phba)  	    !bf_get(lpfc_sliport_status_err, &portstat_reg))  		return -EPERM; +	/* There is no point to wait if the port is in an unrecoverable +	 * state. +	 */ +	if (lpfc_sli4_unrecoverable_port(&portstat_reg)) +		return -EIO; +  	/* wait for the SLI port firmware ready after firmware reset */  	for (i = 0; i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT; i++) {  		msleep(10); @@ -4365,13 +4371,22 @@ static DEVICE_ATTR_RW(lpfc_link_speed);  /*  # lpfc_aer_support: Support PCIe device Advanced Error Reporting (AER) -#       0  = aer disabled or not supported  #       1  = aer supported and enabled (default) -# Value range is [0,1]. Default value is 1. +# PCIe error reporting is always enabled by the PCI core, so this always +# shows 1. +# +# N.B. Parts of LPFC_ATTR open-coded since some of the underlying +# infrastructure (phba->cfg_aer_support) is gone.  */ -LPFC_ATTR(aer_support, 1, 0, 1, -	"Enable PCIe device AER support"); -lpfc_param_show(aer_support) +static uint lpfc_aer_support = 1; +module_param(lpfc_aer_support, uint, S_IRUGO); +MODULE_PARM_DESC(lpfc_aer_support, "Enable PCIe device AER support"); +static ssize_t +lpfc_aer_support_show(struct device *dev, struct device_attribute *attr, +		      char *buf) +{ +	return scnprintf(buf, PAGE_SIZE, "%d\n", lpfc_aer_support); +}  /**   * lpfc_aer_support_store - Set the adapter for aer support @@ -4382,76 +4397,27 @@ lpfc_param_show(aer_support)   * @count: unused variable.   *   * Description: - * If the val is 1 and currently the device's AER capability was not - * enabled, invoke the kernel's enable AER helper routine, trying to - * enable the device's AER capability. If the helper routine enabling - * AER returns success, update the device's cfg_aer_support flag to - * indicate AER is supported by the device; otherwise, if the device - * AER capability is already enabled to support AER, then do nothing. - * - * If the val is 0 and currently the device's AER support was enabled, - * invoke the kernel's disable AER helper routine. After that, update - * the device's cfg_aer_support flag to indicate AER is not supported - * by the device; otherwise, if the device AER capability is already - * disabled from supporting AER, then do nothing. + * PCIe error reporting is enabled by the PCI core, so drivers don't need + * to do anything.  Retain this interface for backwards compatibility, + * but do nothing.   *   * Returns: - * length of the buf on success if val is in range the intended mode - * is supported. - * -EINVAL if val out of range or intended mode is not supported. + * length of the buf on success + * -EINVAL if val out of range   **/  static ssize_t  lpfc_aer_support_store(struct device *dev, struct device_attribute *attr,  		       const char *buf, size_t count)  { -	struct Scsi_Host *shost = class_to_shost(dev); -	struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata; -	struct lpfc_hba *phba = vport->phba; -	int val = 0, rc = -EINVAL; +	int val = 0;  	if (!isdigit(buf[0]))  		return -EINVAL;  	if (sscanf(buf, "%i", &val) != 1)  		return -EINVAL; -	switch (val) { -	case 0: -		if (phba->hba_flag & HBA_AER_ENABLED) { -			rc = pci_disable_pcie_error_reporting(phba->pcidev); -			if (!rc) { -				spin_lock_irq(&phba->hbalock); -				phba->hba_flag &= ~HBA_AER_ENABLED; -				spin_unlock_irq(&phba->hbalock); -				phba->cfg_aer_support = 0; -				rc = strlen(buf); -			} else -				rc = -EPERM; -		} else { -			phba->cfg_aer_support = 0; -			rc = strlen(buf); -		} -		break; -	case 1: -		if (!(phba->hba_flag & HBA_AER_ENABLED)) { -			rc = pci_enable_pcie_error_reporting(phba->pcidev); -			if (!rc) { -				spin_lock_irq(&phba->hbalock); -				phba->hba_flag |= HBA_AER_ENABLED; -				spin_unlock_irq(&phba->hbalock); -				phba->cfg_aer_support = 1; -				rc = strlen(buf); -			} else -				 rc = -EPERM; -		} else { -			phba->cfg_aer_support = 1; -			rc = strlen(buf); -		} -		break; -	default: -		rc = -EINVAL; -		break; -	} -	return rc; +	dev_info_once(dev, "PCIe error reporting automatically enabled by the PCI core; sysfs write ignored\n"); +	return strlen(buf);  }  static DEVICE_ATTR_RW(lpfc_aer_support); @@ -4464,16 +4430,16 @@ static DEVICE_ATTR_RW(lpfc_aer_support);   * @count: unused variable.   *   * Description: - * If the @buf contains 1 and the device currently has the AER support - * enabled, then invokes the kernel AER helper routine + * If the @buf contains 1, invokes the kernel AER helper routine   * pci_aer_clear_nonfatal_status() to clean up the uncorrectable   * error status register.   *   * Notes:   *   * Returns: - * -EINVAL if the buf does not contain the 1 or the device is not currently - * enabled with the AER support. + * -EINVAL if the buf does not contain 1 + * -EPERM if the OS cannot clear AER error status, i.e., when platform + * firmware owns the AER Capability   **/  static ssize_t  lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr, @@ -4491,8 +4457,7 @@ lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr,  	if (val != 1)  		return -EINVAL; -	if (phba->hba_flag & HBA_AER_ENABLED) -		rc = pci_aer_clear_nonfatal_status(phba->pcidev); +	rc = pci_aer_clear_nonfatal_status(phba->pcidev);  	if (rc == 0)  		return strlen(buf); @@ -7277,7 +7242,6 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)  	lpfc_sg_seg_cnt_init(phba, lpfc_sg_seg_cnt);  	lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth); -	lpfc_aer_support_init(phba, lpfc_aer_support);  	lpfc_sriov_nr_virtfn_init(phba, lpfc_sriov_nr_virtfn);  	lpfc_request_firmware_upgrade_init(phba, lpfc_req_fw_upgrade);  	lpfc_suppress_link_up_init(phba, lpfc_suppress_link_up);  |