/* General events handlers for the low level mlx5_core driver * * Other Major feature specific events such as * clock/eswitch/fpga/FW trace and many others, are handled elsewhere, with * separate notifiers callbacks, specifically by those mlx5 components.
*/ staticint any_notifier(struct notifier_block *, unsignedlong, void *); staticint temp_warn(struct notifier_block *, unsignedlong, void *); staticint port_module(struct notifier_block *, unsignedlong, void *); staticint pcie_core(struct notifier_block *, unsignedlong, void *);
/* handler which forwards the event to events->fw_nh, driver notifiers */ staticint forward_event(struct notifier_block *, unsignedlong, void *);
staticconstchar *eqe_type_str(u8 type)
{ switch (type) { case MLX5_EVENT_TYPE_COMP: return"MLX5_EVENT_TYPE_COMP"; case MLX5_EVENT_TYPE_PATH_MIG: return"MLX5_EVENT_TYPE_PATH_MIG"; case MLX5_EVENT_TYPE_COMM_EST: return"MLX5_EVENT_TYPE_COMM_EST"; case MLX5_EVENT_TYPE_SQ_DRAINED: return"MLX5_EVENT_TYPE_SQ_DRAINED"; case MLX5_EVENT_TYPE_SRQ_LAST_WQE: return"MLX5_EVENT_TYPE_SRQ_LAST_WQE"; case MLX5_EVENT_TYPE_SRQ_RQ_LIMIT: return"MLX5_EVENT_TYPE_SRQ_RQ_LIMIT"; case MLX5_EVENT_TYPE_CQ_ERROR: return"MLX5_EVENT_TYPE_CQ_ERROR"; case MLX5_EVENT_TYPE_WQ_CATAS_ERROR: return"MLX5_EVENT_TYPE_WQ_CATAS_ERROR"; case MLX5_EVENT_TYPE_PATH_MIG_FAILED: return"MLX5_EVENT_TYPE_PATH_MIG_FAILED"; case MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR: return"MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR"; case MLX5_EVENT_TYPE_WQ_ACCESS_ERROR: return"MLX5_EVENT_TYPE_WQ_ACCESS_ERROR"; case MLX5_EVENT_TYPE_SRQ_CATAS_ERROR: return"MLX5_EVENT_TYPE_SRQ_CATAS_ERROR"; case MLX5_EVENT_TYPE_INTERNAL_ERROR: return"MLX5_EVENT_TYPE_INTERNAL_ERROR"; case MLX5_EVENT_TYPE_PORT_CHANGE: return"MLX5_EVENT_TYPE_PORT_CHANGE"; case MLX5_EVENT_TYPE_GPIO_EVENT: return"MLX5_EVENT_TYPE_GPIO_EVENT"; case MLX5_EVENT_TYPE_PORT_MODULE_EVENT: return"MLX5_EVENT_TYPE_PORT_MODULE_EVENT"; case MLX5_EVENT_TYPE_TEMP_WARN_EVENT: return"MLX5_EVENT_TYPE_TEMP_WARN_EVENT"; case MLX5_EVENT_TYPE_REMOTE_CONFIG: return"MLX5_EVENT_TYPE_REMOTE_CONFIG"; case MLX5_EVENT_TYPE_DB_BF_CONGESTION: return"MLX5_EVENT_TYPE_DB_BF_CONGESTION"; case MLX5_EVENT_TYPE_STALL_EVENT: return"MLX5_EVENT_TYPE_STALL_EVENT"; case MLX5_EVENT_TYPE_CMD: return"MLX5_EVENT_TYPE_CMD"; case MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED: return"MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED"; case MLX5_EVENT_TYPE_VHCA_STATE_CHANGE: return"MLX5_EVENT_TYPE_VHCA_STATE_CHANGE"; case MLX5_EVENT_TYPE_PAGE_REQUEST: return"MLX5_EVENT_TYPE_PAGE_REQUEST"; case MLX5_EVENT_TYPE_PAGE_FAULT: return"MLX5_EVENT_TYPE_PAGE_FAULT"; case MLX5_EVENT_TYPE_PPS_EVENT: return"MLX5_EVENT_TYPE_PPS_EVENT"; case MLX5_EVENT_TYPE_NIC_VPORT_CHANGE: return"MLX5_EVENT_TYPE_NIC_VPORT_CHANGE"; case MLX5_EVENT_TYPE_FPGA_ERROR: return"MLX5_EVENT_TYPE_FPGA_ERROR"; case MLX5_EVENT_TYPE_FPGA_QP_ERROR: return"MLX5_EVENT_TYPE_FPGA_QP_ERROR"; case MLX5_EVENT_TYPE_GENERAL_EVENT: return"MLX5_EVENT_TYPE_GENERAL_EVENT"; case MLX5_EVENT_TYPE_MONITOR_COUNTER: return"MLX5_EVENT_TYPE_MONITOR_COUNTER"; case MLX5_EVENT_TYPE_DEVICE_TRACER: return"MLX5_EVENT_TYPE_DEVICE_TRACER"; case MLX5_EVENT_TYPE_OBJECT_CHANGE: return"MLX5_EVENT_TYPE_OBJECT_CHANGE"; default: return"Unrecognized event";
}
}
value_lsb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_lsb); /* bit 1-63 are not supported for NICs, * hence read only bit 0 (asic) from lsb.
*/
value_lsb &= 0x1;
value_msb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_msb);
if (net_ratelimit()) {
mlx5_core_warn(dev, "High temperature on sensors with bit set %#llx %#llx.\n",
value_msb, value_lsb); #if IS_ENABLED(CONFIG_HWMON) if (dev->hwmon) {
print_sensor_names_in_bit_set(dev, dev->hwmon, value_lsb, 0);
print_sensor_names_in_bit_set(dev, dev->hwmon, value_msb, sizeof(value_lsb) * BITS_PER_BYTE);
} #endif
}
return NOTIFY_OK;
}
/* MLX5_EVENT_TYPE_PORT_MODULE_EVENT */ staticconstchar *mlx5_pme_status_to_string(enum port_module_event_status_type status)
{ switch (status) { case MLX5_MODULE_STATUS_PLUGGED: return"Cable plugged"; case MLX5_MODULE_STATUS_UNPLUGGED: return"Cable unplugged"; case MLX5_MODULE_STATUS_ERROR: return"Cable error"; case MLX5_MODULE_STATUS_DISABLED: return"Cable disabled"; default: return"Unknown status";
}
}
staticconstchar *mlx5_pme_error_to_string(enum port_module_event_error_type error)
{ switch (error) { case MLX5_MODULE_EVENT_ERROR_POWER_BUDGET_EXCEEDED: return"Power budget exceeded"; case MLX5_MODULE_EVENT_ERROR_LONG_RANGE_FOR_NON_MLNX: return"Long Range for non MLNX cable"; case MLX5_MODULE_EVENT_ERROR_BUS_STUCK: return"Bus stuck (I2C or data shorted)"; case MLX5_MODULE_EVENT_ERROR_NO_EEPROM_RETRY_TIMEOUT: return"No EEPROM/retry timeout"; case MLX5_MODULE_EVENT_ERROR_ENFORCE_PART_NUMBER_LIST: return"Enforce part number list"; case MLX5_MODULE_EVENT_ERROR_UNKNOWN_IDENTIFIER: return"Unknown identifier"; case MLX5_MODULE_EVENT_ERROR_HIGH_TEMPERATURE: return"High Temperature"; case MLX5_MODULE_EVENT_ERROR_BAD_CABLE: return"Bad or shorted cable/module"; case MLX5_MODULE_EVENT_ERROR_PCIE_POWER_SLOT_EXCEEDED: return"One or more network ports have been powered down due to insufficient/unadvertised power on the PCIe slot"; default: return"Unknown error";
}
}
switch (power_status) { case MLX5_PCI_POWER_COULD_NOT_BE_READ:
mlx5_core_info_rl(dev, "PCIe slot power capability was not advertised.\n"); break; case MLX5_PCI_POWER_INSUFFICIENT_REPORTED:
mlx5_core_warn_rl(dev, "Detected insufficient power on the PCIe slot (%uW).\n",
pci_power); break; case MLX5_PCI_POWER_SUFFICIENT_REPORTED:
mlx5_core_info_rl(dev, "PCIe slot advertised sufficient power (%uW).\n",
pci_power); break;
}
}
for (i = ARRAY_SIZE(events_nbs_ref) - 1; i >= 0 ; i--)
mlx5_eq_notifier_unregister(dev, &events->notifiers[i].nb);
flush_workqueue(events->wq);
}
/* This API is used only for processing and forwarding firmware * events to mlx5 consumer.
*/ int mlx5_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb)
{ struct mlx5_events *events = dev->priv.events;
/* This API is used only for processing and forwarding driver-specific * events to mlx5 consumers.
*/ int mlx5_blocking_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb)
{ struct mlx5_events *events = dev->priv.events;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.