diff mbox series

lpfc: Add support for optional pldv handling

Message ID 20210927183518.22130-1-jsmart2021@gmail.com (mailing list archive)
State Accepted
Headers show
Series lpfc: Add support for optional pldv handling | expand

Commit Message

James Smart Sept. 27, 2021, 6:35 p.m. UTC
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.

Co-developed-by: Nigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: Nigel Kirkland <nkirkland2304@gmail.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
---
 drivers/scsi/lpfc/lpfc_hw4.h  |  4 ++++
 drivers/scsi/lpfc/lpfc_init.c | 14 ++++++++++++++
 2 files changed, 18 insertions(+)

Comments

Martin K. Petersen Sept. 29, 2021, 3:28 a.m. UTC | #1
James,

> 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.

Applied to 5.16/scsi-staging, thanks!
Martin K. Petersen Oct. 5, 2021, 4:34 a.m. UTC | #2
On Mon, 27 Sep 2021 11:35:18 -0700, James Smart wrote:

> 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.
> 
> 

Applied to 5.16/scsi-queue, thanks!

[1/1] lpfc: Add support for optional pldv handling
      https://git.kernel.org/mkp/scsi/c/a5b141a895b5
diff mbox series

Patch

diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index 79a4872c2edb..143b73f71333 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -673,6 +673,10 @@  struct lpfc_register {
 #define lpfc_sliport_status_rdy_SHIFT	23
 #define lpfc_sliport_status_rdy_MASK	0x1
 #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 LPFC_CTL_PORT_CTL_OFFSET	0x408
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index d0e64233d273..bd2bc88e2ae9 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -68,6 +68,7 @@ 
 static enum cpuhp_state lpfc_cpuhp_state;
 /* Used when mapping IRQ vectors in a driver centric manner */
 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);
@@ -9359,7 +9360,15 @@  lpfc_sli4_post_status_check(struct lpfc_hba *phba)
 					phba->work_status[0],
 					phba->work_status[1]);
 				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;
 		case LPFC_SLI_INTF_IF_TYPE_1:
 		default:
@@ -11567,6 +11576,9 @@  lpfc_pci_function_reset(struct lpfc_hba *phba)
 			goto out;
 		}
 
+		if (bf_get(lpfc_sliport_status_pldv, &reg_data))
+			lpfc_pldv_detect = true;
+
 		if (!port_reset) {
 			/*
 			 * Reset the port now
@@ -15559,6 +15571,8 @@  lpfc_init(void)
 	/* Initialize in case vector mapping is needed */
 	lpfc_present_cpu = num_present_cpus();
 
+	lpfc_pldv_detect = false;
+
 	error = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN,
 					"lpfc/sli4:online",
 					lpfc_cpu_online, lpfc_cpu_offline);