diff mbox series

[v3,24/24] mpi3mr: add event handling debug prints

Message ID 20210419110156.1786882-25-kashyap.desai@broadcom.com
State Superseded
Headers show
Series Introducing mpi3mr driver | expand

Commit Message

Kashyap Desai April 19, 2021, 11:01 a.m. UTC
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>

Cc: sathya.prakash@broadcom.com
---
 drivers/scsi/mpi3mr/mpi3mr_fw.c | 116 ++++++++++++++++++++++
 drivers/scsi/mpi3mr/mpi3mr_os.c | 164 ++++++++++++++++++++++++++++++++
 2 files changed, 280 insertions(+)

Comments

Himanshu Madhani April 22, 2021, 5:45 p.m. UTC | #1
> On Apr 19, 2021, at 6:01 AM, Kashyap Desai <kashyap.desai@broadcom.com> wrote:

> 

> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>

> Reviewed-by: Hannes Reinecke <hare@suse.de>

> Reviewed-by: Tomas Henzl <thenzl@redhat.com>

> 

> Cc: sathya.prakash@broadcom.com

> ---

> drivers/scsi/mpi3mr/mpi3mr_fw.c | 116 ++++++++++++++++++++++

> drivers/scsi/mpi3mr/mpi3mr_os.c | 164 ++++++++++++++++++++++++++++++++

> 2 files changed, 280 insertions(+)

> 

> diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c

> index ee20d63f6061..b8c3ae98e5f3 100644

> --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c

> +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c

> @@ -155,6 +155,121 @@ void mpi3mr_repost_sense_buf(struct mpi3mr_ioc *mrioc,

> 	spin_unlock(&mrioc->sbq_lock);

> }

> 

> +

> +static void mpi3mr_print_event_data(struct mpi3mr_ioc *mrioc,

> +	Mpi3EventNotificationReply_t *event_reply)

> +{

> +	char *desc = NULL;

> +	u16 event;

> +

> +	event = event_reply->Event;

> +

> +	switch (event) {

> +	case MPI3_EVENT_LOG_DATA:

> +		desc = "Log Data";

> +		break;

> +	case MPI3_EVENT_CHANGE:

> +		desc = "Event Change";

> +		break;

> +	case MPI3_EVENT_GPIO_INTERRUPT:

> +		desc = "GPIO Interrupt";

> +		break;

> +	case MPI3_EVENT_TEMP_THRESHOLD:

> +		desc = "Temperature Threshold";

> +		break;

> +	case MPI3_EVENT_CABLE_MGMT:

> +		desc = "Cable Management";

> +		break;

> +	case MPI3_EVENT_ENERGY_PACK_CHANGE:

> +		desc = "Energy Pack Change";

> +		break;

> +	case MPI3_EVENT_DEVICE_ADDED:

> +	{

> +		Mpi3DevicePage0_t *event_data =

> +		    (Mpi3DevicePage0_t *)event_reply->EventData;

> +		ioc_info(mrioc, "Device Added: Dev=0x%04x Form=0x%x\n",

> +		    event_data->DevHandle, event_data->DeviceForm);

> +		return;

> +	}

> +	case MPI3_EVENT_DEVICE_INFO_CHANGED:

> +	{

> +		Mpi3DevicePage0_t *event_data =

> +		    (Mpi3DevicePage0_t *)event_reply->EventData;

> +		ioc_info(mrioc, "Device Info Changed: Dev=0x%04x Form=0x%x\n",

> +		    event_data->DevHandle, event_data->DeviceForm);

> +		return;

> +	}

> +	case MPI3_EVENT_DEVICE_STATUS_CHANGE:

> +	{

> +		Mpi3EventDataDeviceStatusChange_t *event_data =

> +		    (Mpi3EventDataDeviceStatusChange_t *)event_reply->EventData;

> +		ioc_info(mrioc, "Device Status Change: Dev=0x%04x RC=0x%x\n",

> +		    event_data->DevHandle, event_data->ReasonCode);

> +		return;

> +	}

> +	case MPI3_EVENT_SAS_DISCOVERY:

> +	{

> +		Mpi3EventDataSasDiscovery_t *event_data =

> +		    (Mpi3EventDataSasDiscovery_t *)event_reply->EventData;

> +		ioc_info(mrioc, "SAS Discovery: (%s) status (0x%08x)\n",

> +		    (event_data->ReasonCode == MPI3_EVENT_SAS_DISC_RC_STARTED) ?

> +		    "start" : "stop",

> +		    le32_to_cpu(event_data->DiscoveryStatus));

> +		return;

> +	}

> +	case MPI3_EVENT_SAS_BROADCAST_PRIMITIVE:

> +		desc = "SAS Broadcast Primitive";

> +		break;

> +	case MPI3_EVENT_SAS_NOTIFY_PRIMITIVE:

> +		desc = "SAS Notify Primitive";

> +		break;

> +	case MPI3_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE:

> +		desc = "SAS Init Device Status Change";

> +		break;

> +	case MPI3_EVENT_SAS_INIT_TABLE_OVERFLOW:

> +		desc = "SAS Init Table Overflow";

> +		break;

> +	case MPI3_EVENT_SAS_TOPOLOGY_CHANGE_LIST:

> +		desc = "SAS Topology Change List";

> +		break;

> +	case MPI3_EVENT_ENCL_DEVICE_STATUS_CHANGE:

> +		desc = "Enclosure Device Status Change";

> +		break;

> +	case MPI3_EVENT_HARD_RESET_RECEIVED:

> +		desc = "Hard Reset Received";

> +		break;

> +	case MPI3_EVENT_SAS_PHY_COUNTER:

> +		desc = "SAS PHY Counter";

> +		break;

> +	case MPI3_EVENT_SAS_DEVICE_DISCOVERY_ERROR:

> +		desc = "SAS Device Discovery Error";

> +		break;

> +	case MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:

> +		desc = "PCIE Topology Change List";

> +		break;

> +	case MPI3_EVENT_PCIE_ENUMERATION:

> +	{

> +		Mpi3EventDataPcieEnumeration_t *event_data =

> +		    (Mpi3EventDataPcieEnumeration_t *)event_reply->EventData;

> +		ioc_info(mrioc, "PCIE Enumeration: (%s)",

> +		    (event_data->ReasonCode ==

> +		    MPI3_EVENT_PCIE_ENUM_RC_STARTED) ? "start" : "stop");

> +		if (event_data->EnumerationStatus)

> +			ioc_info(mrioc, "enumeration_status(0x%08x)\n",

> +			    le32_to_cpu(event_data->EnumerationStatus));

> +		return;

> +	}

> +	case MPI3_EVENT_PREPARE_FOR_RESET:

> +		desc = "Prepare For Reset";

> +		break;

> +	}

> +

> +	if (!desc)

> +		return;

> +

> +	ioc_info(mrioc, "%s\n", desc);

> +}

> +

> static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc,

> 	Mpi3DefaultReply_t *def_reply)

> {

> @@ -162,6 +277,7 @@ static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc,

> 	    (Mpi3EventNotificationReply_t *)def_reply;

> 

> 	mrioc->change_count = le16_to_cpu(event_reply->IOCChangeCount);

> +	mpi3mr_print_event_data(mrioc, event_reply);

> 	mpi3mr_os_handle_events(mrioc, event_reply);

> }

> 

> diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c

> index 9a189fb32ab0..2cef7403f941 100644

> --- a/drivers/scsi/mpi3mr/mpi3mr_os.c

> +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c

> @@ -1005,6 +1005,85 @@ static void mpi3mr_devinfochg_evt_bh(struct mpi3mr_ioc *mrioc,

> 

> }

> 

> +/**

> + * mpi3mr_sastopochg_evt_debug - SASTopoChange details

> + * @mrioc: Adapter instance reference

> + * @event_data: SAS topology change list event data

> + *

> + * Prints information about the SAS topology change event.

> + *

> + * Return: Nothing.

> + */

> +static void

> +mpi3mr_sastopochg_evt_debug(struct mpi3mr_ioc *mrioc,

> +	Mpi3EventDataSasTopologyChangeList_t *event_data)

> +{

> +	int i;

> +	u16 handle;

> +	u8 reason_code, phy_number;

> +	char *status_str = NULL;

> +	u8 link_rate, prev_link_rate;

> +

> +	switch (event_data->ExpStatus) {

> +	case MPI3_EVENT_SAS_TOPO_ES_NOT_RESPONDING:

> +		status_str = "remove";

> +		break;

> +	case MPI3_EVENT_SAS_TOPO_ES_RESPONDING:

> +		status_str =  "responding";

> +		break;

> +	case MPI3_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING:

> +		status_str = "remove delay";

> +		break;

> +	case MPI3_EVENT_SAS_TOPO_ES_NO_EXPANDER:

> +		status_str = "direct attached";

> +		break;

> +	default:

> +		status_str = "unknown status";

> +		break;

> +	}

> +	ioc_info(mrioc, "%s :sas topology change: (%s)\n",

> +	    __func__, status_str);

> +	ioc_info(mrioc,

> +	    "%s :\texpander_handle(0x%04x), enclosure_handle(0x%04x) start_phy(%02d), num_entries(%d)\n",

> +	    __func__, le16_to_cpu(event_data->ExpanderDevHandle),

> +	    le16_to_cpu(event_data->EnclosureHandle),

> +	    event_data->StartPhyNum, event_data->NumEntries);

> +	for (i = 0; i < event_data->NumEntries; i++) {

> +		handle = le16_to_cpu(event_data->PhyEntry[i].AttachedDevHandle);

> +		if (!handle)

> +			continue;

> +		phy_number = event_data->StartPhyNum + i;

> +		reason_code = event_data->PhyEntry[i].Status &

> +		    MPI3_EVENT_SAS_TOPO_PHY_RC_MASK;

> +		switch (reason_code) {

> +		case MPI3_EVENT_SAS_TOPO_PHY_RC_TARG_NOT_RESPONDING:

> +			status_str = "target remove";

> +			break;

> +		case MPI3_EVENT_SAS_TOPO_PHY_RC_DELAY_NOT_RESPONDING:

> +			status_str = "delay target remove";

> +			break;

> +		case MPI3_EVENT_SAS_TOPO_PHY_RC_PHY_CHANGED:

> +			status_str = "link status change";

> +			break;

> +		case MPI3_EVENT_SAS_TOPO_PHY_RC_NO_CHANGE:

> +			status_str = "link status no change";

> +			break;

> +		case MPI3_EVENT_SAS_TOPO_PHY_RC_RESPONDING:

> +			status_str = "target responding";

> +			break;

> +		default:

> +			status_str = "unknown";

> +			break;

> +		}

> +		link_rate = event_data->PhyEntry[i].LinkRate >> 4;

> +		prev_link_rate = event_data->PhyEntry[i].LinkRate & 0xF;

> +		ioc_info(mrioc,

> +		    "%s :\tphy(%02d), attached_handle(0x%04x): %s: link rate: new(0x%02x), old(0x%02x)\n",

> +		    __func__, phy_number, handle, status_str, link_rate,

> +		    prev_link_rate);

> +	}

> +}

> +

> /**

>  * mpi3mr_sastopochg_evt_bh - SASTopologyChange evt bottomhalf

>  * @mrioc: Adapter instance reference

> @@ -1026,6 +1105,8 @@ static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc,

> 	u8 reason_code;

> 	struct mpi3mr_tgt_dev *tgtdev = NULL;

> 

> +	mpi3mr_sastopochg_evt_debug(mrioc, event_data);

> +

> 	for (i = 0; i < event_data->NumEntries; i++) {

> 		handle = le16_to_cpu(event_data->PhyEntry[i].AttachedDevHandle);

> 		if (!handle)

> @@ -1052,6 +1133,87 @@ static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc,

> 	}

> }

> 

> +/**

> + * mpi3mr_pcietopochg_evt_debug - PCIeTopoChange details

> + * @mrioc: Adapter instance reference

> + * @event_data: PCIe topology change list event data

> + *

> + * Prints information about the PCIe topology change event.

> + *

> + * Return: Nothing.

> + */

> +static void

> +mpi3mr_pcietopochg_evt_debug(struct mpi3mr_ioc *mrioc,

> +	Mpi3EventDataPcieTopologyChangeList_t *event_data)

> +{

> +	int i;

> +	u16 handle;

> +	u16 reason_code;

> +	u8 port_number;

> +	char *status_str = NULL;

> +	u8 link_rate, prev_link_rate;

> +

> +	switch (event_data->SwitchStatus) {

> +	case MPI3_EVENT_PCIE_TOPO_SS_NOT_RESPONDING:

> +		status_str = "remove";

> +		break;

> +	case MPI3_EVENT_PCIE_TOPO_SS_RESPONDING:

> +		status_str =  "responding";

> +		break;

> +	case MPI3_EVENT_PCIE_TOPO_SS_DELAY_NOT_RESPONDING:

> +		status_str = "remove delay";

> +		break;

> +	case MPI3_EVENT_PCIE_TOPO_SS_NO_PCIE_SWITCH:

> +		status_str = "direct attached";

> +		break;

> +	default:

> +		status_str = "unknown status";

> +		break;

> +	}

> +	ioc_info(mrioc, "%s :pcie topology change: (%s)\n",

> +	    __func__, status_str);

> +	ioc_info(mrioc,

> +	    "%s :\tswitch_handle(0x%04x), enclosure_handle(0x%04x) start_port(%02d), num_entries(%d)\n",

> +	    __func__, le16_to_cpu(event_data->SwitchDevHandle),

> +	    le16_to_cpu(event_data->EnclosureHandle),

> +	    event_data->StartPortNum, event_data->NumEntries);

> +	for (i = 0; i < event_data->NumEntries; i++) {

> +		handle =

> +		    le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);

> +		if (!handle)

> +			continue;

> +		port_number = event_data->StartPortNum + i;

> +		reason_code = event_data->PortEntry[i].PortStatus;

> +		switch (reason_code) {

> +		case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING:

> +			status_str = "target remove";

> +			break;

> +		case MPI3_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING:

> +			status_str = "delay target remove";

> +			break;

> +		case MPI3_EVENT_PCIE_TOPO_PS_PORT_CHANGED:

> +			status_str = "link status change";

> +			break;

> +		case MPI3_EVENT_PCIE_TOPO_PS_NO_CHANGE:

> +			status_str = "link status no change";

> +			break;

> +		case MPI3_EVENT_PCIE_TOPO_PS_RESPONDING:

> +			status_str = "target responding";

> +			break;

> +		default:

> +			status_str = "unknown";

> +			break;

> +		}

> +		link_rate = event_data->PortEntry[i].CurrentPortInfo &

> +		    MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK;

> +		prev_link_rate = event_data->PortEntry[i].PreviousPortInfo &

> +		    MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK;

> +		ioc_info(mrioc,

> +		    "%s :\tport(%02d), attached_handle(0x%04x): %s: link rate: new(0x%02x), old(0x%02x)\n",

> +		    __func__, port_number, handle, status_str, link_rate,

> +		    prev_link_rate);

> +	}

> +}

> /**

>  * mpi3mr_pcietopochg_evt_bh - PCIeTopologyChange evt bottomhalf

>  * @mrioc: Adapter instance reference

> @@ -1073,6 +1235,8 @@ static void mpi3mr_pcietopochg_evt_bh(struct mpi3mr_ioc *mrioc,

> 	u8 reason_code;

> 	struct mpi3mr_tgt_dev *tgtdev = NULL;

> 

> +	mpi3mr_pcietopochg_evt_debug(mrioc, event_data);

> +

> 	for (i = 0; i < event_data->NumEntries; i++) {

> 		handle =

> 		    le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);

> -- 

> 2.18.1

> 


Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>


--
Himanshu Madhani	 Oracle Linux Engineering
diff mbox series

Patch

diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c
index ee20d63f6061..b8c3ae98e5f3 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_fw.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c
@@ -155,6 +155,121 @@  void mpi3mr_repost_sense_buf(struct mpi3mr_ioc *mrioc,
 	spin_unlock(&mrioc->sbq_lock);
 }
 
+
+static void mpi3mr_print_event_data(struct mpi3mr_ioc *mrioc,
+	Mpi3EventNotificationReply_t *event_reply)
+{
+	char *desc = NULL;
+	u16 event;
+
+	event = event_reply->Event;
+
+	switch (event) {
+	case MPI3_EVENT_LOG_DATA:
+		desc = "Log Data";
+		break;
+	case MPI3_EVENT_CHANGE:
+		desc = "Event Change";
+		break;
+	case MPI3_EVENT_GPIO_INTERRUPT:
+		desc = "GPIO Interrupt";
+		break;
+	case MPI3_EVENT_TEMP_THRESHOLD:
+		desc = "Temperature Threshold";
+		break;
+	case MPI3_EVENT_CABLE_MGMT:
+		desc = "Cable Management";
+		break;
+	case MPI3_EVENT_ENERGY_PACK_CHANGE:
+		desc = "Energy Pack Change";
+		break;
+	case MPI3_EVENT_DEVICE_ADDED:
+	{
+		Mpi3DevicePage0_t *event_data =
+		    (Mpi3DevicePage0_t *)event_reply->EventData;
+		ioc_info(mrioc, "Device Added: Dev=0x%04x Form=0x%x\n",
+		    event_data->DevHandle, event_data->DeviceForm);
+		return;
+	}
+	case MPI3_EVENT_DEVICE_INFO_CHANGED:
+	{
+		Mpi3DevicePage0_t *event_data =
+		    (Mpi3DevicePage0_t *)event_reply->EventData;
+		ioc_info(mrioc, "Device Info Changed: Dev=0x%04x Form=0x%x\n",
+		    event_data->DevHandle, event_data->DeviceForm);
+		return;
+	}
+	case MPI3_EVENT_DEVICE_STATUS_CHANGE:
+	{
+		Mpi3EventDataDeviceStatusChange_t *event_data =
+		    (Mpi3EventDataDeviceStatusChange_t *)event_reply->EventData;
+		ioc_info(mrioc, "Device Status Change: Dev=0x%04x RC=0x%x\n",
+		    event_data->DevHandle, event_data->ReasonCode);
+		return;
+	}
+	case MPI3_EVENT_SAS_DISCOVERY:
+	{
+		Mpi3EventDataSasDiscovery_t *event_data =
+		    (Mpi3EventDataSasDiscovery_t *)event_reply->EventData;
+		ioc_info(mrioc, "SAS Discovery: (%s) status (0x%08x)\n",
+		    (event_data->ReasonCode == MPI3_EVENT_SAS_DISC_RC_STARTED) ?
+		    "start" : "stop",
+		    le32_to_cpu(event_data->DiscoveryStatus));
+		return;
+	}
+	case MPI3_EVENT_SAS_BROADCAST_PRIMITIVE:
+		desc = "SAS Broadcast Primitive";
+		break;
+	case MPI3_EVENT_SAS_NOTIFY_PRIMITIVE:
+		desc = "SAS Notify Primitive";
+		break;
+	case MPI3_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE:
+		desc = "SAS Init Device Status Change";
+		break;
+	case MPI3_EVENT_SAS_INIT_TABLE_OVERFLOW:
+		desc = "SAS Init Table Overflow";
+		break;
+	case MPI3_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
+		desc = "SAS Topology Change List";
+		break;
+	case MPI3_EVENT_ENCL_DEVICE_STATUS_CHANGE:
+		desc = "Enclosure Device Status Change";
+		break;
+	case MPI3_EVENT_HARD_RESET_RECEIVED:
+		desc = "Hard Reset Received";
+		break;
+	case MPI3_EVENT_SAS_PHY_COUNTER:
+		desc = "SAS PHY Counter";
+		break;
+	case MPI3_EVENT_SAS_DEVICE_DISCOVERY_ERROR:
+		desc = "SAS Device Discovery Error";
+		break;
+	case MPI3_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:
+		desc = "PCIE Topology Change List";
+		break;
+	case MPI3_EVENT_PCIE_ENUMERATION:
+	{
+		Mpi3EventDataPcieEnumeration_t *event_data =
+		    (Mpi3EventDataPcieEnumeration_t *)event_reply->EventData;
+		ioc_info(mrioc, "PCIE Enumeration: (%s)",
+		    (event_data->ReasonCode ==
+		    MPI3_EVENT_PCIE_ENUM_RC_STARTED) ? "start" : "stop");
+		if (event_data->EnumerationStatus)
+			ioc_info(mrioc, "enumeration_status(0x%08x)\n",
+			    le32_to_cpu(event_data->EnumerationStatus));
+		return;
+	}
+	case MPI3_EVENT_PREPARE_FOR_RESET:
+		desc = "Prepare For Reset";
+		break;
+	}
+
+	if (!desc)
+		return;
+
+	ioc_info(mrioc, "%s\n", desc);
+}
+
 static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc,
 	Mpi3DefaultReply_t *def_reply)
 {
@@ -162,6 +277,7 @@  static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc,
 	    (Mpi3EventNotificationReply_t *)def_reply;
 
 	mrioc->change_count = le16_to_cpu(event_reply->IOCChangeCount);
+	mpi3mr_print_event_data(mrioc, event_reply);
 	mpi3mr_os_handle_events(mrioc, event_reply);
 }
 
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
index 9a189fb32ab0..2cef7403f941 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_os.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
@@ -1005,6 +1005,85 @@  static void mpi3mr_devinfochg_evt_bh(struct mpi3mr_ioc *mrioc,
 
 }
 
+/**
+ * mpi3mr_sastopochg_evt_debug - SASTopoChange details
+ * @mrioc: Adapter instance reference
+ * @event_data: SAS topology change list event data
+ *
+ * Prints information about the SAS topology change event.
+ *
+ * Return: Nothing.
+ */
+static void
+mpi3mr_sastopochg_evt_debug(struct mpi3mr_ioc *mrioc,
+	Mpi3EventDataSasTopologyChangeList_t *event_data)
+{
+	int i;
+	u16 handle;
+	u8 reason_code, phy_number;
+	char *status_str = NULL;
+	u8 link_rate, prev_link_rate;
+
+	switch (event_data->ExpStatus) {
+	case MPI3_EVENT_SAS_TOPO_ES_NOT_RESPONDING:
+		status_str = "remove";
+		break;
+	case MPI3_EVENT_SAS_TOPO_ES_RESPONDING:
+		status_str =  "responding";
+		break;
+	case MPI3_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING:
+		status_str = "remove delay";
+		break;
+	case MPI3_EVENT_SAS_TOPO_ES_NO_EXPANDER:
+		status_str = "direct attached";
+		break;
+	default:
+		status_str = "unknown status";
+		break;
+	}
+	ioc_info(mrioc, "%s :sas topology change: (%s)\n",
+	    __func__, status_str);
+	ioc_info(mrioc,
+	    "%s :\texpander_handle(0x%04x), enclosure_handle(0x%04x) start_phy(%02d), num_entries(%d)\n",
+	    __func__, le16_to_cpu(event_data->ExpanderDevHandle),
+	    le16_to_cpu(event_data->EnclosureHandle),
+	    event_data->StartPhyNum, event_data->NumEntries);
+	for (i = 0; i < event_data->NumEntries; i++) {
+		handle = le16_to_cpu(event_data->PhyEntry[i].AttachedDevHandle);
+		if (!handle)
+			continue;
+		phy_number = event_data->StartPhyNum + i;
+		reason_code = event_data->PhyEntry[i].Status &
+		    MPI3_EVENT_SAS_TOPO_PHY_RC_MASK;
+		switch (reason_code) {
+		case MPI3_EVENT_SAS_TOPO_PHY_RC_TARG_NOT_RESPONDING:
+			status_str = "target remove";
+			break;
+		case MPI3_EVENT_SAS_TOPO_PHY_RC_DELAY_NOT_RESPONDING:
+			status_str = "delay target remove";
+			break;
+		case MPI3_EVENT_SAS_TOPO_PHY_RC_PHY_CHANGED:
+			status_str = "link status change";
+			break;
+		case MPI3_EVENT_SAS_TOPO_PHY_RC_NO_CHANGE:
+			status_str = "link status no change";
+			break;
+		case MPI3_EVENT_SAS_TOPO_PHY_RC_RESPONDING:
+			status_str = "target responding";
+			break;
+		default:
+			status_str = "unknown";
+			break;
+		}
+		link_rate = event_data->PhyEntry[i].LinkRate >> 4;
+		prev_link_rate = event_data->PhyEntry[i].LinkRate & 0xF;
+		ioc_info(mrioc,
+		    "%s :\tphy(%02d), attached_handle(0x%04x): %s: link rate: new(0x%02x), old(0x%02x)\n",
+		    __func__, phy_number, handle, status_str, link_rate,
+		    prev_link_rate);
+	}
+}
+
 /**
  * mpi3mr_sastopochg_evt_bh - SASTopologyChange evt bottomhalf
  * @mrioc: Adapter instance reference
@@ -1026,6 +1105,8 @@  static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc,
 	u8 reason_code;
 	struct mpi3mr_tgt_dev *tgtdev = NULL;
 
+	mpi3mr_sastopochg_evt_debug(mrioc, event_data);
+
 	for (i = 0; i < event_data->NumEntries; i++) {
 		handle = le16_to_cpu(event_data->PhyEntry[i].AttachedDevHandle);
 		if (!handle)
@@ -1052,6 +1133,87 @@  static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc,
 	}
 }
 
+/**
+ * mpi3mr_pcietopochg_evt_debug - PCIeTopoChange details
+ * @mrioc: Adapter instance reference
+ * @event_data: PCIe topology change list event data
+ *
+ * Prints information about the PCIe topology change event.
+ *
+ * Return: Nothing.
+ */
+static void
+mpi3mr_pcietopochg_evt_debug(struct mpi3mr_ioc *mrioc,
+	Mpi3EventDataPcieTopologyChangeList_t *event_data)
+{
+	int i;
+	u16 handle;
+	u16 reason_code;
+	u8 port_number;
+	char *status_str = NULL;
+	u8 link_rate, prev_link_rate;
+
+	switch (event_data->SwitchStatus) {
+	case MPI3_EVENT_PCIE_TOPO_SS_NOT_RESPONDING:
+		status_str = "remove";
+		break;
+	case MPI3_EVENT_PCIE_TOPO_SS_RESPONDING:
+		status_str =  "responding";
+		break;
+	case MPI3_EVENT_PCIE_TOPO_SS_DELAY_NOT_RESPONDING:
+		status_str = "remove delay";
+		break;
+	case MPI3_EVENT_PCIE_TOPO_SS_NO_PCIE_SWITCH:
+		status_str = "direct attached";
+		break;
+	default:
+		status_str = "unknown status";
+		break;
+	}
+	ioc_info(mrioc, "%s :pcie topology change: (%s)\n",
+	    __func__, status_str);
+	ioc_info(mrioc,
+	    "%s :\tswitch_handle(0x%04x), enclosure_handle(0x%04x) start_port(%02d), num_entries(%d)\n",
+	    __func__, le16_to_cpu(event_data->SwitchDevHandle),
+	    le16_to_cpu(event_data->EnclosureHandle),
+	    event_data->StartPortNum, event_data->NumEntries);
+	for (i = 0; i < event_data->NumEntries; i++) {
+		handle =
+		    le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);
+		if (!handle)
+			continue;
+		port_number = event_data->StartPortNum + i;
+		reason_code = event_data->PortEntry[i].PortStatus;
+		switch (reason_code) {
+		case MPI3_EVENT_PCIE_TOPO_PS_NOT_RESPONDING:
+			status_str = "target remove";
+			break;
+		case MPI3_EVENT_PCIE_TOPO_PS_DELAY_NOT_RESPONDING:
+			status_str = "delay target remove";
+			break;
+		case MPI3_EVENT_PCIE_TOPO_PS_PORT_CHANGED:
+			status_str = "link status change";
+			break;
+		case MPI3_EVENT_PCIE_TOPO_PS_NO_CHANGE:
+			status_str = "link status no change";
+			break;
+		case MPI3_EVENT_PCIE_TOPO_PS_RESPONDING:
+			status_str = "target responding";
+			break;
+		default:
+			status_str = "unknown";
+			break;
+		}
+		link_rate = event_data->PortEntry[i].CurrentPortInfo &
+		    MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK;
+		prev_link_rate = event_data->PortEntry[i].PreviousPortInfo &
+		    MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK;
+		ioc_info(mrioc,
+		    "%s :\tport(%02d), attached_handle(0x%04x): %s: link rate: new(0x%02x), old(0x%02x)\n",
+		    __func__, port_number, handle, status_str, link_rate,
+		    prev_link_rate);
+	}
+}
 /**
  * mpi3mr_pcietopochg_evt_bh - PCIeTopologyChange evt bottomhalf
  * @mrioc: Adapter instance reference
@@ -1073,6 +1235,8 @@  static void mpi3mr_pcietopochg_evt_bh(struct mpi3mr_ioc *mrioc,
 	u8 reason_code;
 	struct mpi3mr_tgt_dev *tgtdev = NULL;
 
+	mpi3mr_pcietopochg_evt_debug(mrioc, event_data);
+
 	for (i = 0; i < event_data->NumEntries; i++) {
 		handle =
 		    le16_to_cpu(event_data->PortEntry[i].AttachedDevHandle);