@@ -193,6 +193,7 @@ extern void device_links_no_driver(struct device *dev);
extern bool device_links_busy(struct device *dev);
extern void device_links_unbind_consumers(struct device *dev);
extern void fw_devlink_drivers_done(void);
+extern void fw_devlink_probe_no_timeout(void);
/* device pm support */
void device_pm_move_to_tail(struct device *dev);
@@ -54,6 +54,7 @@ static unsigned int defer_sync_state_count = 1;
static DEFINE_MUTEX(fwnode_link_lock);
static bool fw_devlink_is_permissive(void);
static bool fw_devlink_drv_reg_done;
+static bool fw_devlink_no_timeout;
static bool fw_devlink_best_effort;
/**
@@ -969,6 +970,7 @@ static void device_links_missing_supplier(struct device *dev)
static bool dev_is_best_effort(struct device *dev)
{
return (fw_devlink_best_effort && dev->can_match) ||
+ (fw_devlink_no_timeout && dev->probe_no_timeout) ||
(dev->fwnode && (dev->fwnode->flags & FWNODE_FLAG_BEST_EFFORT));
}
@@ -1688,6 +1690,11 @@ void fw_devlink_drivers_done(void)
device_links_write_unlock();
}
+void fw_devlink_probe_no_timeout(void)
+{
+ fw_devlink_no_timeout = true;
+}
+
/**
* wait_for_init_devices_probe - Try to probe any device needed for init
*
@@ -324,6 +324,8 @@ static int deferred_probe_initcall(void)
if (!IS_ENABLED(CONFIG_MODULES))
fw_devlink_drivers_done();
+ else
+ fw_devlink_probe_no_timeout();
/*
* Trigger deferred probe again, this time we won't defer anything
@@ -734,6 +736,7 @@ static int __driver_probe_device(struct device_driver *drv, struct device *dev)
return -EBUSY;
dev->can_match = true;
+ dev->probe_no_timeout = drv->probe_no_timeout;
pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
drv->bus->name, __func__, dev_name(dev), drv->name);
@@ -536,6 +536,12 @@ struct device_physical_location {
* @can_match: The device has matched with a driver at least once or it is in
* a bus (like AMBA) which can't check for matching drivers until
* other devices probe successfully.
+ * @probe_no_timeout: Set by driver core to indicate that this device's probe
+ * can't wait till driver_probe_timeout expires. This information
+ * is used by fw_devlink=on to avoid deferring the probe of this
+ * device to wait on supplier devices that haven't been added or
+ * probed successfully.
+ * See also: probe_no_timeout in struct driver.
* @dma_coherent: this particular device is dma coherent, even if the
* architecture supports non-coherent devices.
* @dma_ops_bypass: If set to %true then the dma_ops are bypassed for the
@@ -642,6 +648,7 @@ struct device {
bool of_node_reused:1;
bool state_synced:1;
bool can_match:1;
+ bool probe_no_timeout:1;
#if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \
defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
@@ -55,6 +55,15 @@ enum probe_type {
* @owner: The module owner.
* @mod_name: Used for built-in modules.
* @suppress_bind_attrs: Disables bind/unbind via sysfs.
+ * @probe_no_timeout: Set to true by drivers that bind to devices that meet all
+ * these conditions:
+ * - Need to probe successfully before userspace init in started
+ * - Have optional suppliers
+ * - Can't wait for deferred_probe_timeout to expire
+ * fw_devlink=on uses this info, as needed, to ignore dependencies
+ * on supplier devices that have not been added or supplier devices
+ * that don't have any drivers. It's still up to the driver to
+ * decide which of the missing suppliers are optional or not.
* @probe_type: Type of the probe (synchronous or asynchronous) to use.
* @of_match_table: The open firmware table.
* @acpi_match_table: The ACPI match table.
@@ -101,6 +110,8 @@ struct device_driver {
const char *mod_name; /* used for built-in modules */
bool suppress_bind_attrs; /* disables bind/unbind via sysfs */
+ bool probe_no_timeout;
+
enum probe_type probe_type;
const struct of_device_id *of_match_table;