scsi: mpi3mr: Add event handling debug prints
Link: https://lore.kernel.org/r/20210520152545.2710479-25-kashyap.desai@broadcom.com Cc: sathya.prakash@broadcom.com Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
74e1f30a28
commit
9fc4abfe5a
@ -154,6 +154,120 @@ void mpi3mr_repost_sense_buf(struct mpi3mr_ioc *mrioc,
|
|||||||
spin_unlock(&mrioc->sbq_lock);
|
spin_unlock(&mrioc->sbq_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mpi3mr_print_event_data(struct mpi3mr_ioc *mrioc,
|
||||||
|
struct mpi3_event_notification_reply *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:
|
||||||
|
{
|
||||||
|
struct mpi3_device_page0 *event_data =
|
||||||
|
(struct mpi3_device_page0 *)event_reply->event_data;
|
||||||
|
ioc_info(mrioc, "Device Added: dev=0x%04x Form=0x%x\n",
|
||||||
|
event_data->dev_handle, event_data->device_form);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case MPI3_EVENT_DEVICE_INFO_CHANGED:
|
||||||
|
{
|
||||||
|
struct mpi3_device_page0 *event_data =
|
||||||
|
(struct mpi3_device_page0 *)event_reply->event_data;
|
||||||
|
ioc_info(mrioc, "Device Info Changed: dev=0x%04x Form=0x%x\n",
|
||||||
|
event_data->dev_handle, event_data->device_form);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case MPI3_EVENT_DEVICE_STATUS_CHANGE:
|
||||||
|
{
|
||||||
|
struct mpi3_event_data_device_status_change *event_data =
|
||||||
|
(struct mpi3_event_data_device_status_change *)event_reply->event_data;
|
||||||
|
ioc_info(mrioc, "Device status Change: dev=0x%04x RC=0x%x\n",
|
||||||
|
event_data->dev_handle, event_data->reason_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case MPI3_EVENT_SAS_DISCOVERY:
|
||||||
|
{
|
||||||
|
struct mpi3_event_data_sas_discovery *event_data =
|
||||||
|
(struct mpi3_event_data_sas_discovery *)event_reply->event_data;
|
||||||
|
ioc_info(mrioc, "SAS Discovery: (%s) status (0x%08x)\n",
|
||||||
|
(event_data->reason_code == MPI3_EVENT_SAS_DISC_RC_STARTED) ?
|
||||||
|
"start" : "stop",
|
||||||
|
le32_to_cpu(event_data->discovery_status));
|
||||||
|
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:
|
||||||
|
{
|
||||||
|
struct mpi3_event_data_pcie_enumeration *event_data =
|
||||||
|
(struct mpi3_event_data_pcie_enumeration *)event_reply->event_data;
|
||||||
|
ioc_info(mrioc, "PCIE Enumeration: (%s)",
|
||||||
|
(event_data->reason_code ==
|
||||||
|
MPI3_EVENT_PCIE_ENUM_RC_STARTED) ? "start" : "stop");
|
||||||
|
if (event_data->enumeration_status)
|
||||||
|
ioc_info(mrioc, "enumeration_status(0x%08x)\n",
|
||||||
|
le32_to_cpu(event_data->enumeration_status));
|
||||||
|
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,
|
static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc,
|
||||||
struct mpi3_default_reply *def_reply)
|
struct mpi3_default_reply *def_reply)
|
||||||
{
|
{
|
||||||
@ -161,6 +275,7 @@ static void mpi3mr_handle_events(struct mpi3mr_ioc *mrioc,
|
|||||||
(struct mpi3_event_notification_reply *)def_reply;
|
(struct mpi3_event_notification_reply *)def_reply;
|
||||||
|
|
||||||
mrioc->change_count = le16_to_cpu(event_reply->ioc_change_count);
|
mrioc->change_count = le16_to_cpu(event_reply->ioc_change_count);
|
||||||
|
mpi3mr_print_event_data(mrioc, event_reply);
|
||||||
mpi3mr_os_handle_events(mrioc, event_reply);
|
mpi3mr_os_handle_events(mrioc, event_reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -995,6 +995,85 @@ out:
|
|||||||
mpi3mr_tgtdev_put(tgtdev);
|
mpi3mr_tgtdev_put(tgtdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,
|
||||||
|
struct mpi3_event_data_sas_topology_change_list *event_data)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u16 handle;
|
||||||
|
u8 reason_code, phy_number;
|
||||||
|
char *status_str = NULL;
|
||||||
|
u8 link_rate, prev_link_rate;
|
||||||
|
|
||||||
|
switch (event_data->exp_status) {
|
||||||
|
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->expander_dev_handle),
|
||||||
|
le16_to_cpu(event_data->enclosure_handle),
|
||||||
|
event_data->start_phy_num, event_data->num_entries);
|
||||||
|
for (i = 0; i < event_data->num_entries; i++) {
|
||||||
|
handle = le16_to_cpu(event_data->phy_entry[i].attached_dev_handle);
|
||||||
|
if (!handle)
|
||||||
|
continue;
|
||||||
|
phy_number = event_data->start_phy_num + i;
|
||||||
|
reason_code = event_data->phy_entry[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->phy_entry[i].link_rate >> 4;
|
||||||
|
prev_link_rate = event_data->phy_entry[i].link_rate & 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
|
* mpi3mr_sastopochg_evt_bh - SASTopologyChange evt bottomhalf
|
||||||
* @mrioc: Adapter instance reference
|
* @mrioc: Adapter instance reference
|
||||||
@ -1016,6 +1095,8 @@ static void mpi3mr_sastopochg_evt_bh(struct mpi3mr_ioc *mrioc,
|
|||||||
u8 reason_code;
|
u8 reason_code;
|
||||||
struct mpi3mr_tgt_dev *tgtdev = NULL;
|
struct mpi3mr_tgt_dev *tgtdev = NULL;
|
||||||
|
|
||||||
|
mpi3mr_sastopochg_evt_debug(mrioc, event_data);
|
||||||
|
|
||||||
for (i = 0; i < event_data->num_entries; i++) {
|
for (i = 0; i < event_data->num_entries; i++) {
|
||||||
handle = le16_to_cpu(event_data->phy_entry[i].attached_dev_handle);
|
handle = le16_to_cpu(event_data->phy_entry[i].attached_dev_handle);
|
||||||
if (!handle)
|
if (!handle)
|
||||||
@ -1042,6 +1123,88 @@ 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,
|
||||||
|
struct mpi3_event_data_pcie_topology_change_list *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->switch_status) {
|
||||||
|
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->switch_dev_handle),
|
||||||
|
le16_to_cpu(event_data->enclosure_handle),
|
||||||
|
event_data->start_port_num, event_data->num_entries);
|
||||||
|
for (i = 0; i < event_data->num_entries; i++) {
|
||||||
|
handle =
|
||||||
|
le16_to_cpu(event_data->port_entry[i].attached_dev_handle);
|
||||||
|
if (!handle)
|
||||||
|
continue;
|
||||||
|
port_number = event_data->start_port_num + i;
|
||||||
|
reason_code = event_data->port_entry[i].port_status;
|
||||||
|
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->port_entry[i].current_port_info &
|
||||||
|
MPI3_EVENT_PCIE_TOPO_PI_RATE_MASK;
|
||||||
|
prev_link_rate = event_data->port_entry[i].previous_port_info &
|
||||||
|
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
|
* mpi3mr_pcietopochg_evt_bh - PCIeTopologyChange evt bottomhalf
|
||||||
* @mrioc: Adapter instance reference
|
* @mrioc: Adapter instance reference
|
||||||
@ -1063,6 +1226,8 @@ static void mpi3mr_pcietopochg_evt_bh(struct mpi3mr_ioc *mrioc,
|
|||||||
u8 reason_code;
|
u8 reason_code;
|
||||||
struct mpi3mr_tgt_dev *tgtdev = NULL;
|
struct mpi3mr_tgt_dev *tgtdev = NULL;
|
||||||
|
|
||||||
|
mpi3mr_pcietopochg_evt_debug(mrioc, event_data);
|
||||||
|
|
||||||
for (i = 0; i < event_data->num_entries; i++) {
|
for (i = 0; i < event_data->num_entries; i++) {
|
||||||
handle =
|
handle =
|
||||||
le16_to_cpu(event_data->port_entry[i].attached_dev_handle);
|
le16_to_cpu(event_data->port_entry[i].attached_dev_handle);
|
||||||
@ -1899,7 +2064,6 @@ static void mpi3mr_setup_eedp(struct mpi3mr_ioc *mrioc,
|
|||||||
scsiio_req->sgl[0].eedp.flags = MPI3_SGE_FLAGS_ELEMENT_TYPE_EXTENDED;
|
scsiio_req->sgl[0].eedp.flags = MPI3_SGE_FLAGS_ELEMENT_TYPE_EXTENDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mpi3mr_build_sense_buffer - Map sense information
|
* mpi3mr_build_sense_buffer - Map sense information
|
||||||
* @desc: Sense type
|
* @desc: Sense type
|
||||||
|
Loading…
x
Reference in New Issue
Block a user