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

scsi: lpfc: Add support for optional PLDV handling

At adapter attachment or SLI port initialization, read the SLIPORT_STATUS
register to check for pldv_enable. If found, the driver will perform a PCIe
configuration space write when attaching to an SLI port instance that is an
LPe32000 series adapter.

Link: https://lore.kernel.org/r/20210927183518.22130-1-jsmart2021@gmail.comCo-developed-by: default avatarNigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: default avatarNigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 60c98a87
...@@ -673,6 +673,10 @@ struct lpfc_register { ...@@ -673,6 +673,10 @@ struct lpfc_register {
#define lpfc_sliport_status_rdy_SHIFT 23 #define lpfc_sliport_status_rdy_SHIFT 23
#define lpfc_sliport_status_rdy_MASK 0x1 #define lpfc_sliport_status_rdy_MASK 0x1
#define lpfc_sliport_status_rdy_WORD word0 #define lpfc_sliport_status_rdy_WORD word0
#define lpfc_sliport_status_pldv_SHIFT 0
#define lpfc_sliport_status_pldv_MASK 0x1
#define lpfc_sliport_status_pldv_WORD word0
#define CFG_PLD 0x3C
#define MAX_IF_TYPE_2_RESETS 6 #define MAX_IF_TYPE_2_RESETS 6
#define LPFC_CTL_PORT_CTL_OFFSET 0x408 #define LPFC_CTL_PORT_CTL_OFFSET 0x408
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
static enum cpuhp_state lpfc_cpuhp_state; static enum cpuhp_state lpfc_cpuhp_state;
/* Used when mapping IRQ vectors in a driver centric manner */ /* Used when mapping IRQ vectors in a driver centric manner */
static uint32_t lpfc_present_cpu; static uint32_t lpfc_present_cpu;
static bool lpfc_pldv_detect;
static void __lpfc_cpuhp_remove(struct lpfc_hba *phba); static void __lpfc_cpuhp_remove(struct lpfc_hba *phba);
static void lpfc_cpuhp_remove(struct lpfc_hba *phba); static void lpfc_cpuhp_remove(struct lpfc_hba *phba);
...@@ -9359,7 +9360,15 @@ lpfc_sli4_post_status_check(struct lpfc_hba *phba) ...@@ -9359,7 +9360,15 @@ lpfc_sli4_post_status_check(struct lpfc_hba *phba)
phba->work_status[0], phba->work_status[0],
phba->work_status[1]); phba->work_status[1]);
port_error = -ENODEV; port_error = -ENODEV;
break;
} }
if (lpfc_pldv_detect &&
bf_get(lpfc_sli_intf_sli_family,
&phba->sli4_hba.sli_intf) ==
LPFC_SLI_INTF_FAMILY_G6)
pci_write_config_byte(phba->pcidev,
LPFC_SLI_INTF, CFG_PLD);
break; break;
case LPFC_SLI_INTF_IF_TYPE_1: case LPFC_SLI_INTF_IF_TYPE_1:
default: default:
...@@ -11567,6 +11576,9 @@ lpfc_pci_function_reset(struct lpfc_hba *phba) ...@@ -11567,6 +11576,9 @@ lpfc_pci_function_reset(struct lpfc_hba *phba)
goto out; goto out;
} }
if (bf_get(lpfc_sliport_status_pldv, &reg_data))
lpfc_pldv_detect = true;
if (!port_reset) { if (!port_reset) {
/* /*
* Reset the port now * Reset the port now
...@@ -15560,6 +15572,8 @@ lpfc_init(void) ...@@ -15560,6 +15572,8 @@ lpfc_init(void)
/* Initialize in case vector mapping is needed */ /* Initialize in case vector mapping is needed */
lpfc_present_cpu = num_present_cpus(); lpfc_present_cpu = num_present_cpus();
lpfc_pldv_detect = false;
error = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, error = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN,
"lpfc/sli4:online", "lpfc/sli4:online",
lpfc_cpu_online, lpfc_cpu_offline); lpfc_cpu_online, lpfc_cpu_offline);
......
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