> On Apr 19, 2021, at 6:01 AM, Kashyap Desai <kashyap.desai@xxxxxxxxxxxx> wrote: > > Signed-off-by: Kashyap Desai <kashyap.desai@xxxxxxxxxxxx> > Reviewed-by: Hannes Reinecke <hare@xxxxxxx> > Reviewed-by: Tomas Henzl <thenzl@xxxxxxxxxx> > > Cc: sathya.prakash@xxxxxxxxxxxx > --- > 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@xxxxxxxxxx> -- Himanshu Madhani Oracle Linux Engineering